我有一个返回List<?>
的泛型函数。如果它正常工作,它将返回List<LightSensor>
,但我不能直接将函数的结果转换为List<LightSensor>
类型的变量。如何检查列表中的类是否正确的LightSensor? (例如,检查是否List<?> = List<LightSensor>
)
另外,一旦检查完毕,正确投射的最佳方法是什么?
BTW类LightSensor扩展了Object和Serializable的版本
答案 0 :(得分:4)
如何检查列表中的类是否正确的LightSensor? (例如,检查是否
List<?> = List<LightSensor>
)
AFAIK,唯一的方法是迭代列表并在每个元素上使用instanceof LightSensor
或getClass() == LightSensor.class
。
此外,我检查后正确投射的最佳方法是什么?
只需进行类型转换,并禁止“未经检查的转换”警告。
答案 1 :(得分:1)
从方法返回泛型集合的习惯用法如下:
public <T> List<T> getTheList(Class<T> cls){
// you might need the cls in here to create the list.
...
}
显然,使用Class<T>
生成列表的方式是特定于应用程序的。大多数情况下,这在某些类层次结构的上下文中是有意义的,在这种情况下T
扩展了一些基类或接口:
public <T extends MyBaseClassOrInterface> List<T> getTheList(Class<T> cls){
...
}
同样,您创建列表的方式完全取决于应用程序。如果你试图保持整个应用程序的强类型,你可能可以避免做某种黑魔法来找出List<?>
的类型参数。如果您最终得到这样的代码(除非显然您正在处理一些遗留代码),这是一种强烈的代码味道。此外,如果清单是空的,你绝对没有希望。