O código abaixo usando generics, entre as versões do eclipse, só funciona (sem o cast) na 3.1:
public<V> void method(V lo) {
try {
V v = lo.getClass().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}O estranho é que este outro, não funciona nem no 3.1 (é exigido um cast):
public<V> void method2(V lo) {
Class<V> c = lo.getClass();
}Obs: não testei em outros IDEs.
Não sei se deixei escapar algo mas aparentemente as configurações do compilador do eclipse estão iguais nas versões testadas.
Object.getClass retorna um Class<?>, não um Class<V>. Veja o Javadoc.
São fatos da vida.
O que você pode fazer:
class Teste111 {
// Forma 1 - fazer o Java engolir o "warning" - acho que é o que "machuca menos".
public<V> void method2(V lo) {
@SuppressWarnings("unchecked") Class<V> c = (Class<V>)lo.getClass();
}
// Forma 2 - forçar a barra de outra maneira (mudar a declaração de c, e
// passar um parâmetro adicional. Não tem gambiarra mas acho que "machuca mais".
public<V> void method2(V lo, Class<? extends V> klass) {
Class<? extends V> c = lo.getClass().asSubclass(klass);
}
public static void main(String[] args) {
String s = "Hello, world!";
new Teste111().method2 (s);
new Teste111().method2 (s, s.getClass());
}
}
O problema é que a JVM não sabe, em tempo de execução, qual é o tipo de V.
Quando esse código é compilado esse V “vira” java.lang.Object, por isso a necessidade do cast.