我有类,包含不同类型和实现Iterable<Object>
接口。但对我来说非常重要,我可以比较元素。我知道,我不能写出像Iterable<Object & Comparable<?>>
那样的东西,所以我该怎么办?
我确保,课程中包含的每一个元素都是:
null
。不是这样,我只是想比较元素,因为我可以这样做:
private static int hackCMP(Object val, Object val2)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Method m = val.getClass().getMethod("compareTo", val.getClass());
return (Integer) m.invoke(val, val2);
}
我想将元素作为输入传递给另一个类间接构造函数,这也确保元素需要具有可比性。这种方法是:
public static <T extends Comparable<?>> Os of(final Iterator<T> values) {
答案 0 :(得分:2)
Dave Costa指出,你应该真正使用Iterator<Comparable<?>>
而不是Object
。您的类型应根据需要具体说明。如果您有方法Comparable<?>
,那么请使用它。接受对象的方法可以采取任何方式,包括Comparable
秒。
答案 1 :(得分:1)
你可以写
public static <T extends Object & Comparable<?>> Os of(final Iterator<T> values) {
这是你的问题吗?
编辑:如果你想假设对象具有可比性,你可以这样做。
public static int compare(Object o1, Object o2) {
return ((Comparable) o1).compareTo((Compareable) o2);
}
答案 2 :(得分:0)
最好用的是<T extends Comparable<? super T>>
你需要拥有第二个T
,因为当你拥有T extends Comparable<?>
时,实际上并不能确保该类型与自身相当。您可能认为这很愚蠢,但我完全可以创建一个类Foo implements Comparable<String>
,因此Foo
个对象无法与它们进行比较。如果没有第二个T
,您将无法保证对象与自身进行比较,并且必须使用原始类型或不安全的东西来传递它。
? super
更加微妙。在考虑Comparable类的子类时需要它。例如,如果A implements Comparable<A>
和B extends A
,则自动B implements Comparable<A>
(B
不能implement Comparable<B>
,因为它只能实现一次接口)。因此,为了让B
能够使用您的设计,Comparable
的参数应为? super T
,而不仅仅是T
,以使其成为T
的超类