Faz*_*zoM 8 java generics java-7
我有以下课程:
public class Publisher<T> {
private static final Class[] SUPPORTED_CLASSES = new Class[]{T1.class, T2.class};
public Publisher() {
if(Arrays.asList(SUPPORTED_CLASSES).contains(T)) { // error: expression expected!
System.out.println("Class not supported!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何检查类参数是否符合实现?
在上面的例子中,我不能使用类参数T作为参数.
jrt*_*ell 13
您试图在运行时访问泛型类型,由于类型擦除,在这种情况下不起作用.
解决这个问题的最简单方法是Class<T>在构造函数中使用a ,它将在运行时为您提供类型,然后您可以检查List是否包含您给定的值.
public Publisher(Class<T> clazz) {
if(!SUPPORTED_CLASSES.contains(clazz)) {
System.out.println("Class not supported!");
}
}
Run Code Online (Sandbox Code Playgroud)
您的代码当前不支持子类型,这可能会导致问题,除非您对此有所帮助(您可以使用列表,但不一定是ArrayLists),但这确实会使LSP失败.
虽然其他一些答案非常好,但我想提出另一个解决方法:
您可以创建一个空接口MyInterface,并使列表中的所有类都实现此接口.然后,您可以将类声明更改为:
public class Publisher<T extends S, MyInterface>
Run Code Online (Sandbox Code Playgroud)
这将达到你的目的.
| 归档时间: |
|
| 查看次数: |
2791 次 |
| 最近记录: |