Как использовать метод дженериков Java? - PullRequest
2 голосов
/ 27 марта 2019

Я перехожу с C ++ на Java.Сейчас я пытаюсь метод дженериков.Но компилятор всегда жалуется на ошибку ниже

Метод getValue () не определен для типа T HelloTemplate.java / helloTemplate / src / helloTemplate

Ошибка указывала наt.getValue() строка Как я понимаю, T - это класс MyValue, у которого есть метод getValue

Что не так?Как я могу это исправить.Я использую Java1.8

public class MyValue {

    public int getValue() {
       return 0;
    }
}

public class HelloTemplate {

    static <T> int getValue(T t) {
        return t.getValue();
    }
    public static void main(String[] args) {
       MyValue mv = new MyValue();
       System.out.println(getValue(mv));
   }

}

Ответы [ 2 ]

6 голосов
/ 27 марта 2019

Компилятор не знает, что вы собираетесь передать getValue() экземпляр класса, который имеет метод getValue(), поэтому t.getValue() не проходит компиляцию.

Он узнает об этом, только если вы добавите тип, связанный с параметром универсального типа T:

static <T extends MyValue> int getValue(T t) {
    return t.getValue();
}

Конечно, в таком простом примере вы можете просто удалить параметр универсального типа и написать:

static int getValue(MyValue t) {
    return t.getValue();
}
3 голосов
/ 27 марта 2019

Просто вам нужно выполнить приведение перед вызовом метода.return ((MyValue) t).getValue();, чтобы компилятор мог знать, что он вызывает метод MyValue.

   static <T> int getValue(T t) {
        return ((MyValue) t).getValue();
    }

в случае нескольких классов вы можете проверить наличие экземпляров с помощью оператора instanceof и вызова метода .. likeниже

  static <T> int getValue(T t) {
        //check for instances
        if (t instanceof MyValue) {
            return ((MyValue) t).getValue();
        }
        //check for your other instance
  return 0; // whatever for your else case.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...