有没有一种方法可以将一个类转换为具有特定参数的java.lang.Class<>泛型?

5
Class<? extends MyClass> cls = (Class<? extends MyClass>) Class.forName(className);
someMethod(cls); // someMethod expects a Class<? extends MyClass>

上述语句发出警告:“类型安全性:从Class<capture#5-of ?>Class<? extends MyClass>的未检查转换”。
Class<?> cls0 = Class.forName(className);
if (cls0 instanceof Class<? extends MyClass>) {
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0;
    someMethod(cls);
}

这次我遇到了一个错误,是由于类型擦除所致...

Class<?> cls0 = Class.forName(className);
if (MyClass.class.isAssignableFrom(cls0)) {
    Class<? extends MyClass> cls = (Class<? extends MyClass>)cls0;
    someMethod(cls);
}

这次知道cast是安全的,但编译器不知道,仍然会给出警告。(如果你问我,编译器在这里有点笨。)
除了SuppressWarnings之外,有没有避免此警告的方法?

在进行强制类型转换之前,你已经“检查”过了,因此这不是完全的“未经检查的转换”。在这种情况下,你比编译器更清楚,所以告诉它放松一点吧:) - 相关 - https://dev59.com/_GQn5IYBdhLWcg3wvZJ_#16612897 - ZhongYu
需要记住的重要一点是,Class 是特殊的,因为它代表了自己的类型参数。 - biziclop
你的最后一段代码和 @SuppressWarnings 是解决这个问题的方法,或者更好的一步是使用这个,它完全做了与你的代码相同的事情。 - biziclop
1个回答

4
你想要做的正确方法是:

正确的方式是:

Class.forName(className).asSubclass(MyClass.class);

谢谢 - 有趣的是,这种方法的OpenJDK源代码就像我上面第三个代码片段那样使用了“@SuppressWarnings”和“isAssignableFrom”。在发布问题之前,我并不知道这一点。我发现Java泛型如此糟糕,以至于他们必须在自己的源代码中使用“@SuppressWarnings”。 - Adam Burley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接