如何让这个Java泛型代码正常工作?

时间:2014-04-12 16:32:31

标签: java generics

我的Java项目中有两个类:

public abstract class Heap<T extends Comparable<T>> {

      private Comparable<T> data[];
      private int numberOfElements;

      public Heap( int size ) {

           //I am also not sure if this cast will work or is best practice

           data = (Comparable<T>[]) new Comparable<?>[ size + 1 ];

           numberOfElements = 0;
      }

      public void incrementNumberOfElements() { numberOfElements++; }

      public int getNumberOfElements() { return numberOfElements; }

      public Comparable<T>[] getData() { return data; }

      public abstract void insert( Comparable<T> element );
}

class MinHeap<T extends Comparable<T>> extends Heap<T> {

     public MinHeap( int size ) { super(size); }

     public void insert( Comparable<T> element ) {

           incrementNumberOfElements();

           Comparable<T> data[] = getData();

           int current = getNumberOfElements();

           data[ current ] = element;


         //The error is with compareTo()
          while ( current / 2 >= 1 && data[ current ].compareTo( data[ current / 2 ] ) < 0 ) {

                      //code

          }
     }

 }

我使用compareTo()方法得到以下编译时错误:The method compareTo(T) in the type Comparable<T> is not applicable for the arguments (Comparable<T>)。如果我投射这样的数据:data[ current ].compareTo( (T) data[ current / 2 ] )那么错误就会消失,但是会有警告。

我的问题是:添加演员data[ current ].compareTo( (T) data[ current / 2 ] )是最好的方法来实现这项工作吗?如果没有,有什么建议可以让它变得更好?我的目标是创建一个可以与任何实现Comparable接口的类一起使用的Heap。

我对使用泛型不太熟悉,所以感谢任何有用的建议。

2 个答案:

答案 0 :(得分:2)

public void insert( T element ) - 因为要插入类型为T及以上的元素(class MinHeap<T extends Comparable<T>>),指定T必须扩展为Comparable。 我已经将代码更改为使用数组列表而不是数组,不确定是否需要使用数组。

import java.util.ArrayList;
import java.util.List;

public abstract class Heap<T extends Comparable<T>> {

private List<T> data;
private int numberOfElements;

public Heap( int size ) {

    //I am also not sure if this cast will work or is best practice

    data = new ArrayList<T>(size + 1 );

    numberOfElements = 0;
}

public void incrementNumberOfElements() { numberOfElements++; }
public int getNumberOfElements() { return numberOfElements; }
public List<T> getData() { return data; }
public abstract void insert( T element );
}

class MinHeap<T extends Comparable<T>> extends Heap<T> {

public MinHeap( int size ) { super(size); }
public void insert( T element ) {

    incrementNumberOfElements();
    List<T> data = getData();
    int current = getNumberOfElements();
    data.set(current, element);

    //The error is with compareTo()
    while ( current / 2 >= 1 && data.get(current).compareTo( data.get(current / 2) ) < 0 ) {

        //code

    }
}

}

答案 1 :(得分:1)

您的data应该是T[]而不是Comparable<T>[]。这是最有意义的。此外,如果它是T[],那么当你得到一个元素时,它是T,它可以与自身进行比较。但如果它是Comparable<T>,那并不能保证它可以与自身进行比较。

但你也没有方法T[] getData()。 1)data变量是一个内部实现细节,你不应该让外部引用它。 2)如果不知道运行时的组件类型,就不可能创建某个组件类型的数组,而这个组件类型并不在此类中。