从 Integer wrapper class 转换为 int primitive class

Converting from Integer wrapper class to int primitive class

我一直在尝试将 Integer Wrapper class 转换为 int primitive class。我还没有找到使代码编译的正确方法。我正在使用 Intellij IDEA,Java 11 Amazon Coretto,但我需要 运行 它在 运行s java 8.

的计算机上

原代码如下:

static class Line<Integer> extends ArrayList<Integer> implements Comparable<Line<Integer>> {

        @Override
        public int compareTo(Line<Integer> other) {
            int len = Math.min(this.size(), other.size());
            for (int i = 0; i < len; i++) {;
                if ((int) this.get(i) != (int) other.get(i)) {
                    if ((int this.get(i) < (int) this.get(i)) {
                        return -1;
                    } else if ((int) this.get(i) > (int)this.get(i)) {
                        return 1;
                    } else {}
                }
            }
    ...

请注意,Line 已插入到 ArrayList。

最初我对所有 Integer 对象都使用了强制转换,所以它会像 (int) this.get(i)。它在我的本地终端上工作,我的 Intellij 对此并不在意,但不幸的是,在另一台计算机上却没有。它无法在那里编译

我以为是强制转换的原因,因为另一台电脑returned

Main.java:159: error: incompatible types: Integer cannot be converted to int
if ((int) this.get(i) != (int) other.get(i)) {
^
where Integer is a type-variable:
Integer extends Object declared in class Line

所以我将它们全部删除,并认为我可以让机器自行拆箱 Integer 包装器。它仍然没有编译。

如果代码像上面写的那样保留(没有强制转换),它将 return "Operator '<' not applicable for 'Integer', 'Integer'" 所以我使用了 .compareTo() 方法。编译错误。

然后我尝试将它们分配给一个 int 变量。 Intellij IDEA 对我尖叫说它需要 int 但却找到了 Integer。所以我强制施法,像这样

int thisLine = (int) this.get(i);
int otherLine = (int) other.get(i);
if (thisLine != otherLine) {
    if (thisLine < otherLine) {
        return -1;
    } else if (thisLine > otherLine) {
        return 1;
    } else {}

不,没用。删除演员表也没有用。

这次我查阅了有关整数 class 的 Java 文档 (https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#intValue--),发现了一个很有前途的小方法,称为 intValue()。问题是? Intellij 无法解析该方法(奇怪的是,VSCode 不认为这是一个错误)。我是这样用的

int thisLine = this.get(i).intValue();
int otherLine = other.get(i).intValue();
if (this.get(i) != other.get(i)) {
    if (thisLine < otherLine) {
        return -1;
    } else if (thisLine > otherLine) {
        return 1;

果然,在那台顽固的计算机上又出现了一个编译错误。

我运行别无选择。我正在认真考虑创建一个新的自定义 class,这样我就可以将 int 值存储在 ArrayList 中,而不必处理所有这些 Java 向后不兼容的废话。 这里的任何人都知道在 Java?

中将 Integer 包装器对象转换为 int 原始对象的一致方法

这是解释它的错误消息中的线索:

where Integer is a type-variable:

Integer extends Object declared in class Line

Integer 不是 java.lang.Integer 而是一个名称容易混淆的类型变量...

您在这里声明了类型变量:

static class Line<Integer> extends ArrayList<Integer> implements Comparable<Line<Integer>>

就好像你是这样声明的:

static class Line<T> extends ArrayList<T> implements Comparable<Line<T>>

但是通过将类型变量命名为 Integer 而不是 T,然后您稍后尝试将类型 T 的对象转换为 int

通过不声明名为 Integer 的类型参数来修复它,您在这里不需要它:

static class Line extends ArrayList<Integer> implements Comparable<Line<Integer>>

你 class "Integer" 不是 java.lang.Integer 而是通用 class 这就是原因

您根本不必将 Integer 转换为 int。整数 class 有 .compareTo 比较两个整数的方法。

A​​ 0 表示 value1 等于 value2。 -1 是 value1 小于 value2,1 是 value1 大于 value2。

尝试以下操作:

public int compareTo(Line<Integer> other) {
  //get the smallest length
  int len = this.size() <= other.size() ? this.size() : other.size();
  for (int i = 0; i < len; i++) {
    int compare = this.get(i).compareTo(other.get(i));
    if (compare != 0) { //if compare is not zero they are not the same value
       return compare;
    }
  }
  //If we get here, everything in both lists are the same up to "len"
  return 0;
}

The compareTo() method is a method of Integer class under java. lang package. ... It returns the result of the value 0 if Integer is equal to the argument Integer, a value less than 0 if Integer is less than the argument Integer and a value greater than 0 if Integer is greater than the argument Integer.