我有这个方法,其中唯一参数(List elements)
将元素设置为ListModel,但是我需要进行验证以查看泛型类型是否实现了可比性,因为这样的事情:
if (elements instanceof List<? extends Comparable>)
是非法的,我不知道如何进行适当的验证。
我已经使用以下方式完成了此验证:
(elements.size() > 0 && elements.get(0) instanceof Comparable)
但我想知道是否有更清洁的解决方案,例如使用反射?
提前致谢。
答案 0 :(得分:4)
列表的泛型类型为erased at runtime。要使其工作,您需要在方法签名中要求参数或单独测试每个元素。
public void doSomething(List<? extends Comparable> elements) {}
OR
for (Object o : elements) {
if (o instanceof Comparable) {}
}
如果您可以控制代码,前者是首选且更清洁;如果需要,可以将后者包装在实用程序方法调用中。
答案 1 :(得分:2)
那是不可能的。 instanceof
是运行时运算符,而通用信息在运行时丢失(类型擦除)。
答案 2 :(得分:1)
我不是泛型大师,但根据我的理解,你不能这样做的原因是在运行时,ArrayList
和ArrayList<String>
之间没有区别。因此,执行您想要的测试为时已晚。
为什么不宣布您的方法接受List<? extends Comparable>
而不是List
?
特别是,你提出问题的方式使得听起来好像你希望列表总是包含同类元素,但是普通的List
并不能给你任何类型的这样的保证。
答案 3 :(得分:1)
对你的更新:简单地确保一个元素实现Comparable是不够的(如果其他元素不实现怎么办?)并确保所有元素实现Comparable也不足以验证(如果它们是什么实现Comparable但不能相互比较的不同类?)。
但更大的问题是,为什么还要在运行时验证?与仅仅尝试使用它然后看到它失败(即抛出异常,也许你可以捕获)相比,它给了什么好处?