泛型类的类对象(java)

51 java generics

有没有办法在java中获取类似的实例Class<List<Object>>

new*_*cct 66

怎么样

(Class<List<Object>>)(Class<?>)List.class
Run Code Online (Sandbox Code Playgroud)


小智 33

public final class ClassUtil {
    @SuppressWarnings("unchecked")
    public static <T> Class<T> castClass(Class<?> aClass) {
        return (Class<T>)aClass;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你打电话:

Class<List<Object>> clazz = ClassUtil.<List<Object>>castClass(List.class);
Run Code Online (Sandbox Code Playgroud)

  • 不错的主意.这与执行`(Class <List <Object >>)(Class <?>)List.class`基本相同,但是如果你需要多个类对象,那么在ClassUtil中只有一个未经检查的强制转换. (3认同)

Yis*_*hai 10

由于类型擦除,在类级别,所有List接口都是相同的.它们在编译时只是不同的.所以你可以Class<List>作为一个类型,在List.class那种类型的地方,但你不能得到更具体的,因为它们不是单独的类,只是类型声明被编译器删除到显式转换.


Tom*_*ine 6

如其他答案中所述,Class代表擦除类型.要表示类似的东西ArrayList<Object>,你需要一个Type.一个简单的方法是:

new ArrayList<Object>() {}.getClass().getGenericSuperclass()
Run Code Online (Sandbox Code Playgroud)

1.5中引入的泛型API相对容易找到方法.

  • 不仅创建一个新对象,一个新类(在本例中是一个匿名内部类).但那个例子应该是新的ArrayList,不是吗?制作匿名列表需要您实现所有方法. (2认同)

jwo*_*ard 0

您可以使用以下方法获取 List 类型的类对象:

Class.forName("java.util.List")
Run Code Online (Sandbox Code Playgroud)

或者

List.class
Run Code Online (Sandbox Code Playgroud)

但是因为 java 泛型是使用擦除来实现的,所以您无法为每个特定类获取专门的对象。