2017-02-16 3 views
-5

Скажем, например, я создаю класс:Java - Если я укажу несколько дженериков, я должен использовать их все?

class Foo<A, B>{ 
Some stuff... 
} 

Затем, когда я хочу использовать этот класс, я должен указать, что-то для обоих типов?

Foo<Integer, String> bar = new Foo<Integer, String>(69, "AYY LMAO!"); 

или я мог бы просто использовать его? Например:

Foo<Integer> bar = new Foo<Integer>(69); OR 
Foo<String> bar = new Foo<"AYY LMAO!">; 

Если я не могу, могу ли я просто установить типы в null? Например:

Foo<null, Integer> bar = new Foo<Integer>(69); OR 
Foo<String, null> bar = new Foo<String>("AYY LMAO!"); 

Спасибо, и я надеюсь, что это не глупый вопрос. (Довольно много моих вопросов не нравятся).

+1

* Довольно много моих вопросов получить антипатии * - Может быть, вы должны переоценивать свои вопросы и выяснить, почему они получают downvoted, прежде чем получить запретили спрашивать: P (например, этот ...) – Li357

+1

' новый Foo <"AYY LMAO!"> '??? – shmosel

+1

'Foo =' ??? – shmosel

ответ

0

Если вы используете generics *, вам всегда нужно включать оба типа. В зависимости от конкретного применения, существует несколько способов, вы можете сделать это:

  1. Используйте подстановочные для одного из них:

    Foo<?, Integer> foo = new Foo<>(69); 
    
  2. Используйте тип Void:

    Foo<Void, Integer> foo = new Foo<>(69); 
    

Оба эти параметра не позволят вам передать какое-либо значение для A, за исключением null. Типы возврата для первого подхода будут иметь тип Object. Для второго решения они будут Void, которые могут быть только null **, потому что у него нет открытого конструктора.

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

-1

Да, обязательно укажите их все. От JLS Sec 4.5:

Параметризованный типа С хорошо сформирован, если все из следующих условий:

  • C это имя универсального типа.
  • Число аргументов типа совпадает с числом параметров типа в общем объявлении C.
  • При воздействии захвата преобразования (§5.1.10), что приводит к типу C<X1,...,Xn>, каждый тип аргумент Xi является подтипом S[F1:=X1,...,Fn:=Xn] для каждого связанного типа S в Bi.

Это ошибка времени компиляции, если параметризованный тип не является корректным.

Следовательно, если у вас нет одинакового числа аргументов типа, параметризованный тип не является корректным, и поэтому возникает ошибка времени компиляции.

Если вы не хотите, чтобы обеспечить определенный тип для некоторых параметров типа, вы должны использовать подстановочные знаки (?) в качестве заполнителя, так как он говорит in the following section of the language spec:

Wildcards полезны в ситуациях, где требуется только частичное знание параметра типа.

+0

@Downvoter: что не так с этим ответом? –

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