Ahoj,

protože typový parametr není za běhu k dispozici. Při překladu jej
překladač odstraní. Např.

class Box<T> {
  T t;
  Box(T t) { }
}

se přeloží jako

class Box {
  Object t;
  Box(Object t) { }
}

Pokud potřebuješ v konstruktoru typový parameter, lze to udělat přes
parametr typu Class:

class Box<T> {
  T t;
  Box(Class<?> c, T t) {
    System.out.println(c.getName());
  }
}

Box<String> b = new Box<String>(String.class, "abc");

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


Libor Jelinek napsal(a):
> Hezké nedělní poledne!
> Možná jsem málo studoval genericitu, ale proč není možné použít T.class (a
> T.class.getName() apod.) v tomto případě?
>
> public class NewClass<T> {
>
>     public NewClass() {
>          System.out.println("Zavolali jste mě s typem " +
> T.class.getName());
>     }
>
>     public static void main(String[] args) {
>         new NewClass<String>();
>         new NewClass<Integer>();
>     }
> }
>
> NetBeans varuje hláškou: "Cannot select from a type variable".
>
> Pokus o překlad dopadne chybou:
>
> Exception in thread "main" java.lang.RuntimeException: Uncompilable source
> code - Erroneous tree type: <any>
>     at beantablemodel.NewClass.<init>(NewClass.java:14)
>     at beantablemodel.NewClass.main(NewClass.java:18)
> Java Result: 1
>
> Vždyť to je známo jaký objekt jsem dodal (new NewClass<String>()) a na
> každý
> objekt je možné použít .class...
>
> Díky za odpovědi!
> Libor
>

Odpovedet emailem