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 comparing
em 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?
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::getFrom
método que retorna uma String
e irá ser invocada no myClass
tipo de objecto (por meio Function::apply
). É por isso que você tem que passar tipos genéricos myClass
e String
.
No entanto, você poderia omitir esses tipos genéricos porque você está atribuindo o seu comparador de Comparator<myClass> comp
variá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 T
será myClass
e U
será String
. Função var0
terá myClass
como parâmetro e retornará String
(assim método de referência para myClass::getFrom
o trabalho vontade aqui - geralmente será como invocar getFrom
no myClass
objeto). Na verdade, como você pode ver este método irá retornar um Comparator
como uma função lambda que irá usar a função var0
para extrair valores de var1x
e var2x
(ambos estarão myClass
tipos). Para mim, parece um pouco com um fecho.