Java 泛型-元素的合法替代(列表实例<;?扩展可比>;)

Java 泛型-元素的合法替代(列表实例<;?扩展可比>;),java,generics,syntax,instanceof,Java,Generics,Syntax,Instanceof,我有一个方法,该方法的唯一参数(List elements)将元素设置为ListModel,但我需要进行验证,以查看泛型类型是否实现了comparable,因为类似这样的事情: if (elements instanceof List<? extends Comparable>) 但我想知道是否有一个更干净的解决方案,例如使用反射 提前感谢。列表的一般类型为。为此,您需要在方法签名中要求参数,或者单独测试每个元素 public void doSomething(List<?

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

if (elements instanceof List<? extends Comparable>)
但我想知道是否有一个更干净的解决方案,例如使用反射


提前感谢。

列表的一般类型为。为此,您需要在方法签名中要求参数,或者单独测试每个元素

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

如果您可以控制代码,则首选前者并使其更干净;如果需要,可以将后者包装在实用程序方法调用中。

这是不可能的
instanceof
是一个运行时操作符,而泛型信息在运行时丢失(类型擦除)。

我不是泛型专家,但据我所知,您不能这样做的原因是在运行时,
ArrayList
ArrayList
之间没有区别。所以现在进行你想要的测试已经太迟了


为什么不声明您的方法来接受更新的
列表:简单地确保一个元素实现了Compariable是不够的(如果其他元素实现了Compariable怎么办?),并且确保所有元素实现了Compariable也不足以验证(如果它们属于实现可比较但不能相互比较的不同类怎么办?)


但更大的问题是,为什么还要在运行时进行验证呢?与简单地尝试使用它然后看到它失败(即抛出一个异常,您可能会捕获到)相比,这有什么好处?

参数表必须是列表,而不是泛型,因为它适用于可以接受元素可能无法实现可比较的列表的列表模型。这只是一个验证,看看我是否对元素进行排序。我试图使用反射,但当我使用
((ParameterizedType)元素时。getClass().getGenericSuperclass())
我没有得到我想要的。是的,你是对的,我不记得类型擦除!但我需要实现这一点!(验证元素是否实现了可比较,而不执行
if(elements.size()>0&&elements.get(0)instanceof compariable)
,我觉得它太难看了。呵呵。我不能让这个方法接受一个
列表,但是等一下。如果一些元素支持Comparable,而一些不支持Comparable呢?还有,如果,例如,一个元素是
字符串,另一个元素是
长的
?它们都实现了
Comparable
,但是你不能对它们进行比较。看起来不一样就像你真的知道你到底想要什么一样。Comparable本身是非常无用的-这就是为什么它现在被参数化为Comparable-因为你需要知道它能够与什么进行比较。即使你能够得到这个可比实例列表,如果它们彼此不可比(假设列表包含一个字符串和一个BigDecimal类型),在运行时仍然会得到一个ClassCastException,这是泛型试图通过编译器错误来防止的。
public void doSomething(List<? extends Comparable> elements) {}
for (Object o : elements) {
    if (o instanceof Comparable) {}
}