为什么JDK Collections.distinct强制执行参数包含相同的元素类型?

时间:2014-06-11 21:40:08

标签: java types

方法javadoc

我希望以下代码导致类型错误:

List<String> ls = new ArrayList<>();
List<Integer> li = new ArrayList<>();
boolean result = Collections.disjoint(ls, li);

然而,它不会也将永远回归真实。 为什么会这样呢?

3 个答案:

答案 0 :(得分:1)

我没有看到任何奇怪的事。考虑一下在对象之间表达Java中的相等性这一事实,您boolean equals(Object other)而不是boolean equals(T other)

由于equals确实用于查找两个集合是否不相交(或者在集合情况下为hashCode()),为什么还需要引发类型错误?

根据这种观点甚至

Set<Integer> set = new HashSet<Integer>();
boolean test = set.contains("foobar");

应被视为错误。

答案 1 :(得分:0)

我不知道决定背后的确切原因。但是,它允许一些非常有用的行为,例如比较一组Foo和一组Bar extends Foo的不相交。通配符类型是允许这种情况的方式。

答案 2 :(得分:0)

这是一个更好的问题:为什么会这样?

考虑Foo extends BarBar extends JoBlo extends Jo,然后:

List<Jo> jos = new ArrayList<Jo>();
List<Bar> bars = new ArrayList<Bar>();

//populate both lists arbitrarily

Collections.disjoint(jos, bars);

上述调用完全有效,可以返回truefalse,为什么会阻止此操作?