我想创建一个看起来基本上像这样的类:
public class MyClass<T implements Serializable) {
void function() {
Class c = T.class;
}
}
Run Code Online (Sandbox Code Playgroud)
两个错误:
- 我无法调用T.class,即使我可以使用任何其他对象类型
执行此操作 - 我无法强制执行T以这种方式实现Serializable
如何解决我的两个泛型问题?
干杯
聂
你不能得到这种类型.
泛型是使用称为类型擦除的东西实现的.
当实例化泛型类型时,编译器通过称为类型擦除的技术来转换这些类型 - 这是一种编译器删除与类型参数相关的所有信息并在类或方法中键入参数的过程.类型擦除使得使用泛型的Java应用程序能够维护与泛型之前创建的Java库和应用程序的二进制兼容性.
其实质是类型信息由编译器使用并被丢弃,因此在运行时不可用.
关于执行T implements Serializable,您只需要以下内容:
public class MyClass<T extends Serializable>)
{
public void function(T obj)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
这简直是指是一个关系,所以实现了一个类Serializable,是一个 Serializable和可以传递给function.
你做这个:
public class MyClass<T implements Serializable) {
void function(Class<T> tc) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,你必须在运行时传入类才能看到它.你也可以这样做:
public class MyClass<T implements Serializable) {
Class<T> ct;
public MyClass(Class<T> ct){this.ct = ct;}
void function() {
... //you know what the class is here
}
}
Run Code Online (Sandbox Code Playgroud)
这有点烦人,但总体上并不是那么大的麻烦.