public class Test<T>{
        //...........
}////////////////////如何在Test里面获取T的类型?
比如当 Test<String> test=new Test<String>()
Test里面如何获取T就的String??
能不能获得?如何获得?

解决方案 »

  1.   

    既然是范型那就是一种不能确定的类型 所有的对象类型都可以,如果能获得的话,你所获得什么类型?String ?Date?
    一种泛化的类型。
      

  2.   

    参考我的文章吧。可以获得的。Java获得泛型类class的方法和注意事项,ParameterizedType、getGenericSuperclass和getActualTypeArguments的使用
      

  3.   

    T是你随意安排的类型,你既然已经都放String了。那么自然就是获得的String了。
      

  4.   


    这个是获得范型类class,跟楼主说的“Test里面如何获取T就的String”还是不大一样吧?
      

  5.   

    如何在Test里面获取T的类型,想法挺好,但好像不行
      

  6.   

    楼主要了解java中的泛型原理,不得不承认java的泛型确实比C++要差一些。 
    在java中,泛型类型只有在静态类型检查期间才出现,在此之后,程序中的所有泛型类型都将被擦出,替换为它们的非泛型上界。例如List <T>这样的类型注解将被擦除为List,而普通的类型变量在未指定边界的情况下将被擦出为Object。
      

  7.   

    本来想用反射试试的,发现不行,Class.getTypeParameters得到的是T,查阅了文章才知道:Java编译器在编译的时候,同时生成针对擦除类型和泛化类型的两套字节码,而在运行时,JVM只使用擦除类型的字节码,泛化类型的字节码仅仅被用于反射! (引用自:http://tech.it168.com/j/2007-03-02/200703021013218_4.shtml)。所以不能在运行时动态的得到对象的类型化列表。不过也可以选择其他不太优雅的方式,比如:
    public class Test <T>{ 
         private Class type;
    public Test1(Class type){
    this.type = type;
    }
    public void print(){
    System.out.println(type.getCanonicalName());
    }
    public static void main(String[] args) {
    Test<String> t1 = new Test<String>(String.class);
    t1.print();
    Test<Integer> t2 = new Test<Integer>(Integer.class);
    t2.print();
    }

    //out put
    java.lang.String
    java.lang.Object也可是这样:
    public class Test<T> { List<T> lists = new ArrayList<T>();
    public void add(T t){
    lists.add(t);
    System.out.println(t.getClass().getCanonicalName());
    }
    public static void main(String[] args) {
    Test<String> t1 = new Test<String>();
    t1.add("aaaaa");
    Test<Integer> t2 = new Test<Integer>();
    t2.add(new Integer(1));
    }
    }
    //out put
    java.lang.String
    java.lang.Object
      

  8.   

    给它一个父类或接口,用getGenericSuperclass或getGenericInterfaces()就可以获得类型信息
      

  9.   

    给它一个父类或接口,用getGenericInterfaces()或getGenericSuperClass可以得到类型信息