繁体   English   中英

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

[英]Class.asSubclass with multiple bounded types and unchecked cast

我有一个类,其类型为<T extends Enum<T> & Runnable> 我有一个成员变量Class<T> bar ,我按类名设置: 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("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);

哇,放慢一秒! 这是真的吗? 不,这不对! 你所做的就是确定匹配传入名称的类是RunnableEnum ,而不是它实际上是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...

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

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

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

我相信你根本不能......我认为最好的解决方案是直接将Class<T> clazz作为参数传递而不是它的String name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM