Java - 如果我指定多个泛型,我是否必须全部使用它们?

时间:2017-02-16 22:09:23

标签: java generics

比如说我创建了一个类:

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!");

谢谢,我希望这不是一个愚蠢的问题。 (我的很多问题都很讨厌)。

2 个答案:

答案 0 :(得分:0)

如果您正在使用泛型*,则始终需要包含这两种类型。根据您的具体用途,您可以通过以下几种方式执行此操作:

  1. 为其中一个使用通配符:

    Foo<?, Integer> foo = new Foo<>(69);
    
  2. 使用Void类型:

    Foo<Void, Integer> foo = new Foo<>(69);
    
  3. 除了A之外,这两项都会阻止您传递null的任何值。第一种方法的返回类型将是Object类型。对于第二个解决方案,它们将是Void,它只能是null **,因为它没有公共构造函数。

    <子> *您可以使用原始类型并指定 no 类型参数,但强烈建议不要这样做。
    **除非你使用反射来实例化它。

答案 1 :(得分:-1)

是的,必须全部指定它们。来自JLS Sec 4.5

  

如果满足以下所有条件,则参数化类型C格式正确:

     
      
  • C是通用类型的名称。
  •   
  • 类型参数的数量与 C 的通用声明中的类型参数数量相同。
  •   
  • 当进行捕获转换(第5.1.10节),导致类型C<X1,...,Xn>时,每个类型参数Xi对于每个绑定类型S[F1:=X1,...,Fn:=Xn]都是S的子类型在Bi
  •   
     

如果参数化类型格式不正确,则为编译时错误。

因此,如果您没有相同数量的类型参数,则参数化类型的格式不正确,因此会发生编译时错误。

如果您不想为某些类型参数提供特定类型,则应使用通配符(?)作为占位符,如in the following section of the language spec所示:

  

通配符在需要仅部分了解类型参数的情况下非常有用。