比如说我创建了一个类:
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!");
谢谢,我希望这不是一个愚蠢的问题。 (我的很多问题都很讨厌)。
答案 0 :(得分:0)
如果您正在使用泛型*,则始终需要包含这两种类型。根据您的具体用途,您可以通过以下几种方式执行此操作:
为其中一个使用通配符:
Foo<?, Integer> foo = new Foo<>(69);
使用Void
类型:
Foo<Void, Integer> foo = new Foo<>(69);
除了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所示:
通配符在需要仅部分了解类型参数的情况下非常有用。