Código só compila no Eclipse 3.1

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&lt;V&gt; void method2(V lo) {
       @SuppressWarnings("unchecked") Class&lt;V&gt; c = (Class&lt;V&gt;)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&lt;V&gt; void method2(V lo, Class&lt;? extends V&gt; klass) {
       Class&lt;? extends V&gt; c = lo.getClass().asSubclass(klass);
   }
   
   public static void main(String[] args) {
       String s = &quot;Hello, world!&quot;;
       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.

Ok, vcs explicaram o method2(), mas e por que o primeiro funciona sem o cast no Eclipse 3.1?
Aliás esse aqui funciona no 3.1 tb:

public<V> void method2(V lo) { Class<? extends V> c = lo.getClass(); }