Java:尝试将可比较数组转换为整数数组时出错

Java:尝试将可比较数组转换为整数数组时出错,java,return-type,comparable,Java,Return Type,Comparable,我目前正在实现Java中最长递增子序列问题的通用版本。该方法按预期工作,但当我尝试使用Comparable[]而不是Integer[](或int[])时,程序将无法编译。给出的错误是“Compariable不能转换为整数”。我理解这个错误以及它的含义,但我不知道如何修复它。任何帮助都将不胜感激:) 我已经尝试将该方法的返回类型设置为泛型(>),但问题是Java不允许创建泛型数组。我已经尝试使用Integer[]作为返回类型,虽然它可以正常编译和工作,但这不是我想要的 public class L

我目前正在实现Java中最长递增子序列问题的通用版本。该方法按预期工作,但当我尝试使用Comparable[]而不是Integer[](或int[])时,程序将无法编译。给出的错误是“Compariable不能转换为整数”。我理解这个错误以及它的含义,但我不知道如何修复它。任何帮助都将不胜感激:)

我已经尝试将该方法的返回类型设置为泛型(>),但问题是Java不允许创建泛型数组。我已经尝试使用Integer[]作为返回类型,虽然它可以正常编译和工作,但这不是我想要的

public class LIS {
  public static void main(String[] args) {
    final Integer[] arr = {-1, 2, 4, 2, 33, 4, 7, 8, 10, 7, 5, 4, 5, 5, 1};
    final Integer[] LIS = (Integer[]) lis(arr);
    for (int i : LIS) {
      System.out.print(i + " ");
    }
  }

  public static Comparable[] lis(Comparable[] arr) {
    // We use Comparable[] so we can use interchangably with any Comparable type

    final int N = arr.length;

    // Java conveniently initializes array values to 0:
    int[] lisEndingHere = new int[N];

    for (int i = 0; i < N; i++) {
      lisEndingHere[i] = 1;
      int curMax = 0;
      for (int j = 0; j <= i; j++) {
        if (arr[i].compareTo(arr[j]) <= 0) continue;
        if (lisEndingHere[j] > curMax) {
          curMax = lisEndingHere[j];
        }
      }
      lisEndingHere[i] += curMax;
    }

    // Find and return the longest increasing subsequence:
    int max = 0;
    for (int i = 0; i < N; i++) {
      if (lisEndingHere[i] > max) max = lisEndingHere[i];
    }

    Comparable[] LIS = new Comparable[max];
    for (int i = N-1; i >= 0 && max != 0; i--) {
      if (lisEndingHere[i] == max) {
        LIS[--max] = arr[i];
      }
    }

    return LIS;
  }
}
公共类LIS{
公共静态void main(字符串[]args){
最后一个整数[]arr={-1,2,4,2,33,4,7,8,10,7,5,4,5,5,1};
最终整数[]LIS=(整数[])LIS(arr);
用于(int i:LIS){
系统输出打印(i+“”);
}
}
公共静态可比[]lis(可比[]arr){
//我们使用Compariable[],因此我们可以与任何可比类型互换使用
最终int N=阵列长度;
//Java方便地将数组值初始化为0:
int[]lisendingher=新的int[N];
对于(int i=0;i=0&&max!=0;i--){
if(lisEndingHere[i]==max){
LIS[--max]=arr[i];
}
}
返回LIS;
}
}
只需更改行即可

final Integer[] LIS = (Integer[]) lis(arr);

并更新for循环

您的方法返回一个可比较的数组,因此您不能向下转换为整数数组,但由于数字的实现是整数,因此在运行时它们仍然被视为整数


将结果设置为整数数组与生成泛型方法的目的背道而驰。对于要传递给您的方法的内容,它必须具有compareTo方法,并且固有地具有toString方法,并且该方法满足您需要程序执行的所有操作。

这里没有需要修复的内容。在这里:

Integer[] LIS = (Integer[]) lis(...) 
方法lis()返回可比较对象的数组。可比数组不是整数数组!因此,从概念上来说,该演员阵容无法发挥作用

是的,该数组包含整数对象,但数组类型不是“整数数组”

您必须迭代生成的数组,然后才能强制转换各个条目。但是您不能将数组类型本身强制转换为它不是的类型


除此之外,您还可以将泛型与列表一起使用

@GhostCat谢谢你的提示,你说得对-我马上给你换!记录在案:你只能接受一个答案,但你可以对收到的任何答案进行投票,以表示你对帮助你的人的感谢:-)
Integer[] LIS = (Integer[]) lis(...)