泛型 - 法律替代(元素实例列表<! - ?extends Comparable - >)

时间:2011-08-07 19:04:05

标签: java generics syntax instanceof

我有这个方法,其中唯一参数(List elements)将元素设置为ListModel,但是我需要进行验证以查看泛型类型是否实现了可比性,因为这样的事情:

if (elements instanceof List<? extends Comparable>)

是非法的,我不知道如何进行适当的验证。

更新

我已经使用以下方式完成了此验证:

(elements.size() > 0 && elements.get(0) instanceof Comparable)

但我想知道是否有更清洁的解决方案,例如使用反射?

提前致谢。

4 个答案:

答案 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)

我不是泛型大师,但根据我的理解,你不能这样做的原因是在运行时,ArrayListArrayList<String>之间没有区别。因此,执行您想要的测试为时已晚。

为什么不宣布您的方法接受List<? extends Comparable>而不是List

特别是,你提出问题的方式使得听起来好像你希望列表总是包含同类元素,但是普通的List并不能给你任何类型的这样的保证。

答案 3 :(得分:1)

对你的更新:简单地确保一个元素实现Comparable是不够的(如果其他元素不实现怎么办?)并确保所有元素实现Comparable也不足以验证(如果它们是什么实现Comparable但不能相互比较的不同类?)。

但更大的问题是,为什么还要在运行时验证?与仅仅尝试使用它然后看到它失败(即抛出异常,也许你可以捕获)相比,它给了什么好处?