2010-07-27 17 views
2

在Java中,我将如何使用泛型创建一个max函数,该函数需要两个相同类型的Comparable对象并返回较大的对象?使用泛型创建最大函数返回较大的一个

我尝试:

public static <T extends Comparable> T max(T obj1, T obj2) 
{ 
    return (((obj1).compareTo(obj2) >= 0) ? obj1 : obj2); 
} 

(。如果它们均等于它返回OBJ1)

该方法基于代码我发现在http://www.informit.com/articles/article.aspx?p=170176&seqNum=3

然而,当我编译我得到这样的警告(与-Xlint编译:未选中): 警告:未经检查]作为原料类型的成员未经检查调用的compareTo(T)java.lang.Comparable的

回答

11

发生这种情况是因为您使用原始类型Comparable,并且编译器无法确定您正在比较的内容,因为compareTo使用Comparable的类型参数。您需要参数化可比还有:

public static <T extends Comparable<? super T>> T max(T obj1, T obj2) 

您需要使用? super T因为你可能有延伸的B类,它实现Comparable<B> A类,但一个没有实现Comparable<A>。因此,您可以传递最多两个A对象,而B匹配? super A,因此即使对于A对象,也可以调用B中定义的compareTo方法。如果你想使用<T extends Comparable<T>>并试图通过两个A对象编译会抱怨说,他们没有实现Comparable<A>,即使它们继承B.

+0

类似于'Collections.max()'。 – 2010-07-27 20:52:31

+0

非常感谢。 – ladaghini 2010-07-27 23:32:33

+0

@MarkPeters:你能解释Collections.max()函数的泛型部分吗?它太混乱了。或者请提供相关链接。 – IfOnly 2017-05-04 15:40:34

0

public static <T extends Comparable<T>>一个compareTo方法将移除警告。

+1

这不是一个很好的API选择,尽管它不必要的限制。 – 2010-07-27 20:53:33