情景:
我的尝试:
private ArrayList<Component> components = new ArrayList<Component>();
public <T extends Component> T getComponent( T type )
{
for ( Component c : components )
{
if ( c instanceof T )
{
return (T) c;
}
}
return null;
}
编译器在if语句上报告以下错误:
无法对类型参数T执行instanceof检查。请使用其擦除组件,因为在运行时将删除其他泛型类型信息
实现此行为的推荐方法是什么?
答案 0 :(得分:2)
您可能希望依赖Class.isInstanceOf(Object)
:
for (Component c : components) {
if (type.getClass().isInstance(c)) {
return (T) c;
}
}
确定指定的Object是否与此Class表示的对象分配兼容。此方法是Java语言
instanceof
运算符的动态等效项。
提供Class
实例而不是对象更有意义:
public <T extends Component> T getComponent(Class<T> type)
{
for (Component c : components) {
if (type.isInstance(c)) {
return (T) c;
}
}
return null;
}
答案 1 :(得分:1)
编译器很清楚
使用其擦除组件
您可以将参数T type
替换为Component c
之后你只需要提取c的类型(它将是一个实现,因此c.getClass()将是一个扩展Component的类。)
您应该检查类型是否匹配并返回第一个元素。
private ArrayList<Component> components = new ArrayList<Component>();
public <T extends Component> T getComponent( Component component )
{
for ( Component c : components )
{
if ( c.getClass().equals(component.getClass()) )
{
return c;
}
}
return null;
}
我认为它应该运作良好。
我希望它有所帮助