Ter um erro ao usar Cordas em Comparador

ball_jan:

Eu estou tentando criar uma classe que implementa comparáveis. Quando todos os elementos da classe são inteiro, tudo funciona bem. Quando eu ir com cordas e usar comparingem vez de comparingInt, I receber os seguintes erros.

  • número incorrecto de argumentos de tipo genérico para método de comparação (função) de tipo comparador; ele não pode ser parametrizada com argumentos

  • Os myClassdoes tipo não definir getFrom (T), que é aqui aplicável

public class myClass implements Comparable<myClass> {
    @Column (name="From")
    private String from;
    @Column (name="To")
    private String to;
    @Column (name="With")
    private String with;
    @Column (name="amount")
    private int amount;

    // Setters, getters, constructor

    Comparator<myClass > comp = Comparator.<myClass>comparing(myClass::getFrom)
            .thenComparing(myClass::getTo)
            .thenComparing(myClass::getWith)
            .thenComparingInt(myClass::getAmount);
    @Override
    public int compareTo(myClass o) {
        return comp.compare(this, o);
    }
}

Alguém poderia apontar o que eu poderia estar ausente aqui?

Michalk:

Comparador :: comparando é um método genérico que tem uma função que é usada para extrair o valor a ser comparado. É passada uma referência ao método myClass::getFrommétodo que retorna uma Stringe irá ser invocada no myClasstipo de objecto (por meio Function::apply). É por isso que você tem que passar tipos genéricos myClasse String.

No entanto, você poderia omitir esses tipos genéricos porque você está atribuindo o seu comparador de Comparator<myClass> compvariável para os tipos podem ser inferido automaticamente (também usando tipos de sua referência método utilizado).

Olhando para olhar ainda mais Vamos a Comparator::comparing(Function)implementação do método:

static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0) {
    Objects.requireNonNull(var0);
    return (Comparator)((Serializable)((var1x, var2x) -> {
        return ((Comparable)var0.apply(var1x)).compareTo(var0.apply(var2x));
    }));
}

Aqui Tserá myClasse Userá String. Função var0terá myClasscomo parâmetro e retornará String(assim método de referência para myClass::getFromo trabalho vontade aqui - geralmente será como invocar getFromno myClassobjeto). Na verdade, como você pode ver este método irá retornar um Comparatorcomo uma função lambda que irá usar a função var0para extrair valores de var1xe var2x(ambos estarão myClasstipos). Para mim, parece um pouco com um fecho.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=231911&siteId=1
Recomendado
Clasificación