Как интерпретировать "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
)?
Ответы
Ответ 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?