Как мне сделать набор стандартного значения c? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть следующее определение:

public class myClass<T> {
    private T value;

    protected <T> void setValue(T value) {
        if (value != null) // optional
            this.value = value;
    }
}

Однако я получаю ошибку компиляции с этим:

Type mismatch: cannot convert from T to T

(я знаю, полезно и логично?).

Как правильно настроить этот метод? Также обратите внимание, что подпись настраивается в абстрактном классе следующим образом:

@SuppressWarnings("hiding")
protected abstract <T> void setValue(T value);

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

У вас два несвязанных типа T. В объявлении вашего метода <T> повторно объявляет тип T, скрывая переменную типа уровня класса.

Короче говоря, вам не нужно, чтобы метод был generi c, потому что вы хотите, чтобы setValue принял тип, объявленный в классе. Поскольку параметр типа доступен во всем классе, ваш метод должен быть таким же простым, как:

protected void setValue(T value) {
    if (value != null)
        this.value = value;
}

Если ваш абстрактный класс также является generi c, то в него также необходимо внести такую ​​же коррекцию. В противном случае вам придется пересмотреть его конструкцию, так как использование метода, принимающего случайно типизированные значения, не совсем правильное.

1 голос
/ 03 августа 2020

Вы уже определили T на уровне класса, если вы снова поместите его в метод, он принимает его как другой T. Посмотрите сообщение об ошибке, которое я получаю при попытке скомпилировать ваш код.

MyClass.java:6: error: incompatible types: T#1 cannot be converted to T#2
        this.value = value;
                     ^
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>setValue(T#1)
    T#2 extends Object declared in class MyClass
1 error

Просто удалите второе объявление T, и оно будет компилироваться, как задумано.

public class MyClass<T> {
    private T value;

    protected void setValue(T value) {
        if (value != null) {
            this.value = value;   
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...