Java - 在方法参数中使用Class参数

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失败.


Nat*_*han 6

虽然其他一些答案非常好,但我想提出另一个解决方法:

您可以创建一个空接口MyInterface,并使列表中的所有类都实现此接口.然后,您可以将类声明更改为:

public class Publisher<T extends S, MyInterface>
Run Code Online (Sandbox Code Playgroud)

这将达到你的目的.