Подтвердить что ты не робот

Как интерпретировать "public <T> T readObjectData (... Class <T> type)" в Java?

У меня есть этот код Java.

public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;

Как интерпретировать этот код? Зачем нам public <T> T вместо public T?

Как передать параметр второму аргументу (Class<T> type)?

4b9b3361

Ответ 1

Это объявляет общий метод readObjectData с одним параметром типа T.

public <T> ...

Тогда возвращаемый тип T.

... T readObjectData(...

Без начального <T>, который является объявлением общего типа, символ T будет undefined.

В списке параметров Class<T> type является одним из параметров. Поскольку тип возвращаемого значения и этот параметр ссылаются на T, это гарантирует, что если вы пройдете через Class<String>, тогда он вернет String. Если вы перейдете в Class<Double>, то он вернет Double.

Чтобы передать параметр, пройдите в любой объект Class, например. String.class.

Ответ 2

Часть <T> объявляет общий аргумент типа T. Если бы вы пропустили эту часть, компилятор, скорее всего, пожаловался бы, что тип T не существует.

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

public <T> T readObjectData(...
        ^  ^
        |  + Return type
        + Generic type argument

Ответ 3

<T> - класс параметров. Нет класса с именем T. Вы можете использовать этот метод с любым классом, указанным с помощью аргумента второго метода с именем type.

поскольку метод определяется следующим образом:

public <T> T readObjectData(ByteBuffer buffer, Class<T> type)

Вы можете назвать это, как указано ниже:

MyClass obj = o.readObjectData(buffer, MyClass.class);

Обратите внимание, что вам не нужно указывать возвращаемое значение readOjectData() на MyClass. Когда-то, до java 5, этот метод был бы определен как:

public Object readObjectData(ByteBuffer)

и его использование выглядело следующим образом:

MyClass obj = (MyClass)o.readObjectData(buffer);

Поскольку кастинг может вызвать ClassCastException, это плохая практика. Это было причиной изобретения дженериков.

Ответ 4

Вероятно, вас смущает аналогичное и более общее объявление:

class MyClass<T> {
   private  T myMethod(T a){
       return  a;
   }
}

В приведенном выше случае нет необходимости в "<T>" после приватного (private <T> T myMethod(T a))

поскольку используемое T оно совпадает с тем, которое определено в классе MyClass<T>

Более того, если вы пишете

class MyClass<T> {
   private <T> T myMethod(T a){
       return  a;
   }
}

то смысл в том, что возвращаемый тип myMethod (потенциально) отличается от типа MyClass. Как будто вы написали это:

class MyClass<T1> {
   private <T2> T2 myMethod(T2 a){
       return  a;
   }
}

Кредиты: Принял пример из "Kanagavelu Sugumar" более длинный ответ на Как использовать Class <T> в Java?