2011-08-29 39 views
2

我正在创建一个泛型类,该泛型类具有一个应该对数组集合进行排序的方法,该集合可以是书本,也可以是CD。我在两个类型类中实现了Comparable,并试图对GenericCollection类中的数组进行排序。在泛型类中排序

我的方法貌似现在这种权利:

public void sort(){ 
    for (int i = 0; i < collection.length; i++) { 
     for (int j = 0; j < collection.length; j++) { 
      if (((T)collection[i]).compareTo((T)collection[j]) > 0){ 
       T t = (T)collection[i]; 
       collection[i] = collection[j]; 
       collection[j] = t; 
      }     
     } 
    } 
} 

这使我的错误对象是不具有可比性。如果我尝试转换为键入T,那么出现CompareTo的T未定义的错误。如果我尝试类似:

<T extends Comparable> 

我可以编译,但我得到一个运行时错误,即使我有两种类型正在使用这个类可比定义。

如何让泛型类型能够在自己的类中运行compareTo方法。

感谢您的任何帮助。

+0

集合的类型是什么? – JustinKSU

+2

什么是运行时错误? – Daniel

+0

@Justin。它是T类型的通用集合...换句话说,它可以是书或CD(客户端类)。我在使用任何一种类型时都会遇到错误。 – Andy

回答

1

如果你需要实现自己的排序算法,试图声明您的泛型集合类的类型参数为

<T extends Comparable<T>> 

这意味着,你的类定义应该是这样的:

class GenericCollection<T extends Comparable<T>> { ... } 

当然,您的书籍或CD类应实现此确切类型:

class Book implements Comparable<Book> { ... } 

class CD implements Comparable<CD> { ... } 

如果使用参数<T extends Comparable>,那么您使用的是原始类型,这些仅用于与旧(预代数)代码的兼容性,不应在新代码中使用。

+0

这是为方法的顶部,还是它用于当我调用构造函数? – Andy

+0

感谢您的帮助,这真的很好。 – Andy

+0

-1这不是有效的声明 – newacct

7

您应该使用内置排序,但要回答您需要的问题。

<T extends Comparable<T>> 

或比较模糊

<T extends Comparable<? super T>> 

public static <T extends Comparable<? super T>> void sort(List<T> list) 

这个故事的寓意是:如果你不打算使用一个内置的功能,不正是你想要什么,你至少应该先理解它,因为它可能会为你提供一些提示。 ;)

+0

Awww ..我讨厌有道德的故事....:P无论如何,谢谢。我会试试 – Andy

+1

感谢您的帮助,这解决了这个问题,但对我而言,工作是将它放在类规范而不是方法中。 – Andy