![](/img/trans.png)
[英]Difference between generics <T extends Number & Comparable<T>> and T extends Comparable<? extends Number>
[英]Generics - Legal alternative for (elements instanceof List<? extends Comparable>)
我有这个方法,其中唯一的参数(List elements)
将元素设置为ListModel,但我需要进行验证以查看泛型类型是否实现了可比性,因为这样的事情:
if (elements instanceof List<? extends Comparable>)
是非法的,我不知道如何做正确的验证。
我已经使用以下方法完成了此验证:
(elements.size() > 0 && elements.get(0) instanceof Comparable)
但我想知道是否有更清洁的解决方案,例如使用反射?
提前致谢。
那是不可能的。 instanceof
是运行时运算符,而通用信息在运行时丢失(类型擦除)。
我不是泛型大师,但根据我的理解,你不能这样做的原因是在运行时, ArrayList
和ArrayList<String>
之间没有区别。 因此,执行您想要的测试为时已晚。
为什么不声明你的方法接受List<? extends Comparable>
List<? extends Comparable>
而不是List
?
特别是,你提出问题的方式使得听起来好像你希望列表总是包含同类元素,但是一个普通的旧List
不会给你任何类似的保证。
对你的更新:简单地确保一个元素实现Comparable是不够的(如果其他元素不实现怎么办?)并确保所有元素实现Comparable也不足以验证(如果它们属于不同的类,该怎么办?实现可比较但无法相互比较?)。
但更大的问题是,为什么还要在运行时验证? 与仅仅尝试使用它然后看到它失败(即抛出异常,也许你可以捕获)相比,它给了什么好处?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.