import java.util.*;
class Dog { int size; Dog(int s) { size = s; } }
public class FirstGrade {
public static void main(String[] args) {
TreeSet<Integer> i = new TreeSet<Integer>();
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog(1)); d.add(new Dog(2)); d.add(new Dog(1));
i.add(1); i.add(2); i.add(1);
System.out.println(d.size() + " " + i.size());
}
}
What is the result?
A. 1 2
B. 2 2
C. 2 3
D. 3 2
E. 3 3
F. Compilation fails
G. An exception is thrown at runtime
A resposta correta é a G. Porém, eu gostaria de saber porque o compilador não consegue detectar que Dog não possui a interface Comparable implementado. Uma vez que eu declarei o TreeSet explicitamente como um treeSet que só aceita Dogs, pra mim o compilador teria condição de dar um erro em tempo de compilação. Caso fosse:
TreeSet d = new TreeSet();
d.add(new Dog(1)); d.add(new Dog(2)); d.add(new Dog(1));
ou mesmo
TreeSet d = new TreeSet<Dog>();
d.add(new Dog(1)); d.add(new Dog(2)); d.add(new Dog(1));
Eu concordo que não tem como o comipilador avisar nada. Mas, no caso, temos:
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog(1)); d.add(new Dog(2)); d.add(new Dog(1));
o que para mim é informação suficiente para o compilador detectar que Dog não implementa a interface Comparable (o que vai dar problema para um treeset...)
Alguém possui alguma explicação do porquê o compilador não detecta isso?
Obrigado!