【问题标题】:Type safety: Unchecked cast between Class-Objects类型安全:类对象之间的未经检查的强制转换
【发布时间】:2009-05-21 11:01:11
【问题描述】:

我对泛型等很满意,但在这种特殊情况下,我有一个关于“类型安全:从 .. 到 .. 的未经检查的强制转换”警告的问题。

基本上我有一个 Class 对象列表,现在我想获得其中的一个子集来实​​现一个特殊的接口,但生成的 List 也应该有那个特殊的类型:

...
private List<Class<?>> classes;

public List<Class<? extends Concrete>> getConcreteClasses() {

    List<Class<? extends Concrete>> concreteClasses = new LinkedList<Class<? extends Concrete>>();

    for (Class<?> clazz: this.classes) {
        for (Class<?> i : clazz.getInterfaces()) {
            if (i.equals(Concrete.class)) {
                concreteClasses.add((Class<? extends Concrete>) clazz);
            }
        }
    }

    return concreteClasses;

}

警告当然与类型转换有关:

Type safety: Unchecked cast from Class<?> to Class<? extends Concrete>

我可以摆脱类型转换还是应该使用@SuppressWarnings("unchecked") 来抑制警告?

感谢您的回答!

PS:环境是Java 6。

解决方案:代替

concreteClasses.add((Class<? extends Concrete>) clazz);

使用

concreteClasses.add(clazz.asSubclass(Concrete.class));

【问题讨论】:

  • 很好的答案,在这里救了我的命。

标签: java generics class casting


【解决方案1】:

【讨论】:

  • 谢谢!实际上我已经在另一段代码中使用了 asSubclass() ......哎呀:D
  • 如果您需要使用反射来抑制其他地方的警告,请不要感到惊讶。 (一如既往,反射是邪恶的。)
【解决方案2】:

您可以取消警告,因为您确信强制转换会起作用,因为您添加的所有类都实现了 Concrete 接口...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-02-03
    • 2013-12-15
    相关资源
    最近更新 更多