我有按类型(类)返回组件(扩展组件接口的对象)实例的方法。
退货的最佳或正确方法是什么?使用未经检查的泛型或将组件作为组件类型返回。还是有比我发现的这两个更好的方法?实际上,我想通过语句(例如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/