未经检查的泛型或

未经检查的泛型或

我有按类型(类)返回组件(扩展组件接口的对象)实例的方法。

退货的最佳或正确方法是什么?使用未经检查的泛型或将组件作为组件类型返回。还是有比我发现的这两个更好的方法?实际上,我想通过语句(例如ConcreteComponent cc = this.getComponent();)中指定的返回类型来获取组件;

@SuppressWarnings("unchecked")
public <T> T getComponent(final Class<? extends T> type) {
    for (Component c : this.components) {
        if (c.getClass().isAssignableFrom(type)) { return (T) c; }
    }
    return null;
}

public Component getComponent2(final Class<? extends Component> type) {
    for (Component c : this.components) {
        if (c.getClass().isAssignableFrom(type)) { return c; }
    }
    return null;
}

最佳答案

您似乎具有Class.isAssignableFrom()的逻辑倒退。

如果目标是检索与给定类型赋值兼容的第一个组件,那么我可能会这样写:

public <T extends Component> T getComponent(Class<T> type) {
    for (Component c : this.components) {
        if (type.isAssignableFrom(c.getClass())) {
            return type.cast(c);
        }
    }
    return null;
}


笔记:


在参数type的类型参数中使用通配符会适得其反。使用通用方法已经为您提供了所需的所有灵活性,并且可以帮助您避免在调用函数时使用显式类型参数。
Class.cast()是文字安全类型转换的类型安全(某种)替代。如果使用它,则应该能够不抑制类型安全警告。
您不能将所选组件的实际类作为方法的形式返回类型,因为在编译时无法知道该类。 (我不确定您是否真的在要求这个,但听起来好像您是。)

关于java - 未经检查的泛型或对象装箱?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27028192/

10-09 00:03