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>

这将达到你的目的。