繁体   English   中英

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

[英]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)

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

提前致谢。

列表的泛型类型在运行时擦除 要使其工作,您需要在方法签名中要求参数或单独测试每个元素。

public void doSomething(List<? extends Comparable> elements) {}

要么

for (Object o : elements) {
    if (o instanceof Comparable) {}
}

如果您可以控制代码,前者是首选且更清洁; 如果需要,可以将后者包装在实用程序方法调用中。

那是不可能的。 instanceof是运行时运算符,而通用信息在运行时丢失(类型擦除)。

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

为什么不声明你的方法接受List<? extends Comparable> List<? extends Comparable>而不是List

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM