2

我试图弄清楚如何比较 T[] 数组中的两个项目,这就是我所拥有的:

public static <T extends Comparable< ? super T>> T getLargest(T [] a, int low, 
               int high){
    if(low>high)
            throw new IllegalArgumentException();
    T[] arrCopy = (T[]) new Object[high-low];
    for(int i=low;i<high;i++){
        if(a[i].compareTo(a[i-1])>0)
            arrCopy[i]=a[i];
        else
            arrCopy[i]=a[i+1];
    }
    return arrCopy[0];
}

然后我得到错误:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

关于如何解决这个问题的任何想法?

4

6 回答 6

5

您可以像这样分配数组:

@SuppressWarnings("unchecked")
T[] arrCopy = (T[]) Array.newInstance(a.getClass().getComponentType(), high-low);

尽管未经检查的警告是必要的,但这实际上应该是安全的。

顺便说一句,如果你想在数组中找到最大的元素,这里有一个 oneliner:

public static <T extends Comparable<T>> T max(final T[] data) {
    return Collections.max(Arrays.asList(data));
}

对于完整的问题,您可以使用以下两者之一(它们是等效的):

public static <T extends Comparable<T>> T maxA(final T[] data,int from, int to) {
    return Collections.max(Arrays.asList(Arrays.copyOfRange(data, from, to)));
}
public static <T extends Comparable<T>> T maxB(final T[] data,int from, int to) {
    return Collections.max(Arrays.asList(data).subList(from, to));
}
于 2011-10-17T15:23:41.417 回答
2

没有理由假设Object实例数组适合作为Comparable实例数组处理。您强制转换ObjectT,我们期望 extends Comparable,但是这里甚至不需要未经检查的分配。

相反,考虑一个不复制任何数组的实现:

public static <T extends Comparable<? super T>>
T getLargest(T[] a, int first, int last)
{
  // Don't tolerate an empty range:
  if (first >= last)
    throw new IllegalArgumentException();
  // Eventually checked by subsequent use of array index operator:
  if (first < 0 || first >= a.length ||
      last < 0 || last >= a.length)
    throw new IndexOutOfBoundsException();

  T largest = a[first];
  while (++first != last)
  {
    final T candidate = a[first];
    if (candidate.compareTo(largest) > 0)
      largest = candidate;
  }
  return largest;
}

或者,使用Collections#max(), 提供您的数组,List在通过Arrays#asList().

于 2011-10-17T15:36:36.757 回答
2

利用:

public static <T extends Comparable<? super T>> T max(final T[] data, int fromIndex, 
               int toIndex) {
    return Collections.max(Arrays.asList(data).subList(fromIndex, toIndex));
}
于 2011-10-17T15:42:38.853 回答
2

当您只关心 1 个对象时,不确定为什么要创建一个全新的数组,但这个问题与泛型无关。你不能将一个Object[]更具体的类型转换为String[],就像你不能写一样String s = new Object()

由于您只关心最大值,因此只跟踪 1 个值(迄今为止看到的最大值)而不是整个数组会更有意义。

于 2011-10-17T15:17:48.480 回答
2

你在这里得到错误:

T[] arrCopy = (T[]) new Object[high-low];

您不能将所有对象 (java.lang.object) 的母对象强制转换为任何以 java.lang.comparable 作为最低公分母的对象,因此会引发异常。一个对象(如在 java.lang.object 中)不实现 java.lang.comparable。

在您的具体示例中,您需要创建一个 T 数组(或至少 java.lang.comparable)。

于 2011-10-17T15:18:39.883 回答
0

只需更改new Object[high-low];new Comparable[high-low];. 泛型被擦除到它们的下限,所以 T 被擦除到 Comparable。

于 2011-10-19T20:48:18.863 回答