Java 如何实例化类等泛型变量<;富<;T>>;?

Java 如何实例化类等泛型变量<;富<;T>>;?,java,generics,Java,Generics,我需要实例化类>之类的泛型变量。 比如说, Class<? extends List<String>> = ... ClassList myList=new ArrayList(); ClassList myList=new ArrayList(); Class你不能做得很好。要么使用原始类型,要么使用不安全的类型转换。您无法正确执行此操作。要么使用原始类型,要么使用不安全的强制转换。拥有类,实际上没有任何意义,因为它等同于类(由于擦除,两者都是对原始列表的引用) 话虽

我需要实例化类>之类的泛型变量。 比如说,

Class<? extends List<String>> = ...
Class
List myList=new ArrayList();
Class
List myList=new ArrayList();

Class你不能做得很好。要么使用原始类型,要么使用不安全的类型转换。

您无法正确执行此操作。要么使用原始类型,要么使用不安全的强制转换。

拥有
,实际上没有任何意义,因为它等同于
(由于擦除,两者都是对原始列表的引用)

话虽如此,如果您的意图是表示
列表
类型,则这是可能的,请参阅

TypeLiteral类型=新的TypeLiteral(){};
System.out.println(type.getType())//应该打印列表吗

使之成为可能的机制是对静态类型声明的反射,在任何一个类定义中(
classx扩展Foo
,Y通过反射可用,它保留在字节码中),方法定义等。TypeLiteral使用前者,您可能会注意到它创建了一个全新的类,因此,最终的效果是保留类型参数。当你真的在与擦除作斗争时,这是一个很好的解决办法。

拥有
,其实没有什么意义,因为它相当于
(由于擦除,两者都是对原始列表的引用)

话虽如此,如果您的意图是表示
列表
类型,则这是可能的,请参阅

TypeLiteral类型=新的TypeLiteral(){};
System.out.println(type.getType())//应该打印列表吗
使之成为可能的机制是对静态类型声明的反射,在任何一个类定义中(
classx扩展Foo
,Y通过反射可用,它保留在字节码中),方法定义等。TypeLiteral使用前者,您可能会注意到它创建了一个全新的类,因此,最终的效果是保留类型参数。当你真的在与擦除作斗争时,这是一个很好的解决方法。

你可以写:

    class ListString extends java.util.LinkedList<String> { }
    Class<? extends java.util.List<String>> clazz = ListString.class;
class ListString扩展了java.util.LinkedList{}
类您可以编写:

    class ListString extends java.util.LinkedList<String> { }
    Class<? extends java.util.List<String>> clazz = ListString.class;
class ListString扩展了java.util.LinkedList{}

仅通过创建不必要的对象并使用getClass()方法初始化?对象确实不必要,仅强制转换即可。嗯。。。需要不必要的对象:仅通过创建不必要的对象并使用getClass()方法来初始化?该对象确实是不必要的,仅强制转换即可。嗯。。。需要不必要的对象:Class@downvoter-也许你没有领会“或使用不安全施法”实际上是被接受答案的意思?@downvoter-也许你没有领会“或使用不安全施法”实际上是被接受答案的意思?类似于
List<String> myList = new ArrayList<String>();
Class<? extends List<String>> var = (Class<? extends List<String>>)myList.getClass();
TypeLiteral<List<String>> type = new TypeLiteral<List<String>>() {};
System.out.println(type.getType()); //should print List<String>
    class ListString extends java.util.LinkedList<String> { }
    Class<? extends java.util.List<String>> clazz = ListString.class;