2016-01-15 4 views
0

Я читал о дженериках в Java и here, и, хотя я понимаю суть их, у меня есть небольшая проблема с пониманием заголовка общего метода Java. Я привык:Понимание общего шаблона Java-метода

public returnType methodName(parameters){body} 

Что держит меня в заблуждении является спецификацией общей декларации методы:

public *genericType* returnType methodName(parameters){body} 

или

public static <T> void fromArrayToCollection(Collection<T> c) {} 

Что такое объявление типа (<T> между статическим и пустота)? Является ли это просто описанием типа параметров метода?

+2

Это означает, что этот метод имеет параметр типового типа, называемый «T» – khelwood

+0

@khelwood Почему не существует 'Collection ' в подписи, неявно имеющей тот же смысл? – Matt

+1

Он позволяет вам добавить общий тип параметра только к этому методу, а не объявлять его на уровне класса. – azurefrog

ответ

4

<T> между static и void в данном случае означает «Существует общий параметр типа именуется T в этом методе.»

Сравнить Случай 1:

class Foo<T> { 
    public void doFoo(Collection<T> items) ... 
} 

с корпусом 2:

class Foo { 
    public <T> void doFoo(Collection<T> items) ... 
} 

и случай 3:

class Foo { 
    public void doFoo(Collection<T> items) ... 
} 

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

Во втором случае T является общим типом, существующим только в методе doFoo.

В случае 3, T должен быть фактическим типом, потому что нет объявления, что он является типичным параметром типа.

2

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

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

+0

Типы внутри общего тела фактически известны только во время компиляции (а не во время выполнения), благодаря [стиранию типа] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html) – augray

+0

@augray «исправил» его, но он кажется неуклюжим. Я посмотрю, смогу ли я найти лучший способ выразить это. Благодарим за то, что я объяснил, что дженерики были указаны во время компиляции – Aaron

Смежные вопросы