未经检查的泛型或对象拳击?

Mat*_*uth 1 java generics

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

返回组件的最佳或正确方法是什么?使用uncheked泛型或返回组件作为组件类型.还是有更好的方法然后这两个我发现了?实际上我想通过statement(ex.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;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

你似乎有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;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • `type.isAssignableFrom(c.getClass())`也可以是`type.isInstance(c)`. (2认同)