加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 具有多个有界类型和未经检查的强制转换的Class.asSubcla

发布时间:2020-12-15 00:40:22 所属栏目:Java 来源:网络整理
导读:我有一个类,其类型为 T extends Enum T. 安培;可运行的取代.我有一个成员变量Class T我按类名设置的栏:t =(Class T)Class.forName(name).这给了我一个未经检查的投射警告. 通常,使用asSubclass可以在类似的情况下使用,但由于T有多个边界,我无法在没有获得编
我有一个类,其类型为< T extends Enum< T>. &安培;可运行的取代.我有一个成员变量Class< T>我按类名设置的栏:t =(Class< T>)Class.forName(name).这给了我一个未经检查的投射警告.

通常,使用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(“未选中”)的情况下以任何方式摆脱此警告吗?

完整示例:

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.你只验证了边界.想象一下,我们有T1和T2类:

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

这也不是多重边界的问题.你只有一个绑定你有同样的问题.

正如@ 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);
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读