java - 具有多个有界类型和未经检查的转换的 Class.asSubclass

标签 java generics casting

我有一个用类型 <T extends Enum<T> & Runnable> 泛化的类.我有一个成员变量 Class<T> bar我通过类名设置:t = (Class<T>) Class.forName(name) .这给了我一个未经检查的 Actor 警告。

通常,使用 asSubclass可以在类似情况下使用,但由于 T有多个边界,我无法在没有收到编译器警告的情况下使用它:

//This is type safe, but I still get an unchecked cast warning
t = (Class<T>) Class.forName(className).asSubclass(Enum.class).asSubclass(Runnable.class);

我可以不使用 @SupressedWarning("unchecked") 以任何方式消除此警告吗? ?

完整示例:

public class Example<T extends Enum<T> & Runnable> {
    Class<T> t;

    Example(String className) throws ClassNotFoundException {
        t = (Class<T>) Class.forName(className).asSubclass(Enum.class).asSubclass(Runnable.class);
    }
}

最佳答案

//This is type safe, but I still get an unchecked cast warning
t = (Class<T>) Class.forName(className).asSubclass(Enum.class).asSubclass(Runnable.class);

哇,慢点!这是真的吗?不,这不对!您所做的就是确定与传入名称匹配的类都是 Runnable。和一个 Enum ,并不是说它实际上是 T .您只验证了边界。想象一下我们有课 T1T2 :

package foo;
public enum T1 implements Runnable {
    ;
    @Override
    public void run() {
    }
}

package foo;
public enum T2 implements Runnable {
    ;
    @Override
    public void run() {
    }
}

然后这工作正常,但显然类型不安全:

Example<T1> example = new Example<T1>("foo.T2");
Class<T1> t1Clazz = example.t; //uh oh...

这也不是多重边界的问题。如果只有一个绑定(bind),你会遇到同样的问题。

正如@sp00m 提到的,真正的解决方案可能是传入 Class<T>在这里。

编辑

另一方面,如果 T只需要内部(即指定多个边界)并且实际上不需要公开,那么另一种选择是在两个单独的引用中维护类。例如:

Class<? extends Runnable> runnableClass;
Class<? extends Enum> enumClass;

Example(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class<?> clazz = Class.forName(className);
    runnableClass = clazz.asSubclass(Runnable.class);
    enumClass = clazz.asSubclass(Enum.class);
}

那是因为,如果没有类型参数,在极少数情况下您可以利用它是一个 enum 的知识。和一个 Runnable同时。如果创建类的实例,则需要将其分配给 Runnable 类型的变量/字段或 Enum ;你不能两者兼顾。

关于java - 具有多个有界类型和未经检查的转换的 Class.asSubclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543846/

相关文章:

java - 在 Java 中实现 Bean 类时遇到问题 - ClassCastException

java - 单击按钮循环浏览 Jlabel 图像时出现 for 循环问题

Java代码给出ORA-12514错误,但我可以通过外部程序连接

通用工厂的 Java 通用不编译

sql-server - 将 Varchar 转换为固定长度

c - C中的动态类型转换

java - 单个 mangedQuery 扫描多个文件夹中的音频文件

c# - 将 '==' 运算符应用于泛型参数

java - JDK 1.7 打破了向后兼容性? (泛型)

casting - 将 Vec<u32> 就地转换为 Vec<u8> 且开销最小