Java - 在方法参数中使用 Class 参数
Java - Use Class parameter in method parameter
我关注class:
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!");
}
}
}
如何检查class参数是否符合实现?
在上面的例子中我不能使用 class 参数 T 作为参数。
为什么这不起作用
您试图在 运行 时访问通用类型,在这种情况下不起作用,因为 type erasure。
如何修复
解决此问题的最简单方法是在构造函数中使用 Class<T>
,它将在 运行 时为您提供类型,然后您可以检查列表是否包含您拥有的值已经给了。
示例代码
public Publisher(Class<T> clazz) {
if(!SUPPORTED_CLASSES.contains(clazz)) {
System.out.println("Class not supported!");
}
}
可能的问题
您的代码目前不支持子类型,这可能会导致问题,除非您同意这一点(您可以处理列表,但不一定是 ArrayList),但这确实会导致 LSP。
您需要将 class 传递给构造函数:
public Publisher(Class<T> clazz) {
if(!SUPPORTED_CLASSES.contains(clazz)) {
System.out.println("Class not supported!");
}
}
因为 T
在运行时不可用:new Publisher<T1>()
和 new Publisher<T3>()
.
将执行完全相同的代码
虽然其他一些答案很好,但我想提出另一个解决方法:
您可以创建一个空接口 MyInterface
,并让列表中的所有 class 实现该接口。然后,您可以将 class 声明更改为:
public class Publisher<T extends S, MyInterface>
这将达到你的目的。
我关注class:
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!");
}
}
}
如何检查class参数是否符合实现?
在上面的例子中我不能使用 class 参数 T 作为参数。
为什么这不起作用
您试图在 运行 时访问通用类型,在这种情况下不起作用,因为 type erasure。
如何修复
解决此问题的最简单方法是在构造函数中使用 Class<T>
,它将在 运行 时为您提供类型,然后您可以检查列表是否包含您拥有的值已经给了。
示例代码
public Publisher(Class<T> clazz) {
if(!SUPPORTED_CLASSES.contains(clazz)) {
System.out.println("Class not supported!");
}
}
可能的问题
您的代码目前不支持子类型,这可能会导致问题,除非您同意这一点(您可以处理列表,但不一定是 ArrayList),但这确实会导致 LSP。
您需要将 class 传递给构造函数:
public Publisher(Class<T> clazz) {
if(!SUPPORTED_CLASSES.contains(clazz)) {
System.out.println("Class not supported!");
}
}
因为 T
在运行时不可用:new Publisher<T1>()
和 new Publisher<T3>()
.
虽然其他一些答案很好,但我想提出另一个解决方法:
您可以创建一个空接口 MyInterface
,并让列表中的所有 class 实现该接口。然后,您可以将 class 声明更改为:
public class Publisher<T extends S, MyInterface>
这将达到你的目的。