Преобразование из класса-оболочки Integer в класс примитивов int - PullRequest
0 голосов
/ 17 октября 2019

Я пытался преобразовать класс Integer Wrapper в int примитивный класс. Я еще не нашел правильный способ заставить код компилироваться. Я использую Intellij IDEA, Java 11 Amazon Coretto, но мне нужно запустить его на компьютере под управлением 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 {}
                }
            }
    ...

обратите внимание, чтоСтрока вставляется в ArrayList.

Изначально я использовал принудительное приведение ко всем объектам Integer, поэтому оно будет похоже на (int) this.get(i). Он работал на моем локальном терминале, и мой Intellij не беспокоился об этом, но, к сожалению, не другой компьютер. Он не может скомпилировать там

Я думал, что это из-за принудительного приведения, поскольку другой компьютер возвратил

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

, поэтому я удалил их все и подумал, что могу позволить машине распаковатьЦелочисленная обертка сама по себе. Он по-прежнему не компилируется.

Если оставить код, подобный тому, что написан выше (без принудительного приведения), он вернет «Оператор» <, не применимый для «Целое число», «Целое число». Поэтому я использовалметод .compareTo (). Ошибка компиляции. </p>

Затем я попытался присвоить их переменной 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 {}

Нет, не сработало. Удаление приведения также не сработало.

Я посмотрел Javadocs (https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#intValue--) на этот раз о классе Integer и обнаружил многообещающий метод с именем 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;

и, конечно же, еще одна ошибка компиляции на этом упрямом компьютере.

Я работаюЯ серьезно рассматриваю возможность создания нового пользовательского класса, чтобы хранить значения int в ArrayList, не сталкиваясь со всей этой бессмыслицей обратной несовместимости с Java. Любой, кто знает здесь, знает непротиворечивый метод для преобразования объекта-оболочки Integer вint примитивный объект в Java?

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Это подсказка в сообщении об ошибке, которое объясняет это:

, где Integer является переменной типа:

Integer расширяет объект, объявленный в классе 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>>
1 голос
/ 17 октября 2019

Вам вообще не нужно приводить целое число к int. Целочисленный класс имеет .compareTo методы, которые сравнивают два целых числа.

0 означает, что значение1 равно значению2. -1 - значение1 меньше значения2, а 1 - значение1 больше значения2.

Попробуйте следующее:

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;
}

Метод compareTo () является методом класса Integer в Java. Ланг пакет. ... Возвращает результат значения 0, если Integer равно аргументу Integer, значение меньше 0, если Integer меньше аргумента Integer, и значение больше 0, если Integer больше аргумента Integer.

0 голосов
/ 17 октября 2019

В вашем классе "Integer" - это не java.lang.Integer, а универсальный класс, который является причиной

...