
构造函数起作用的原因是您要明确指定类型参数。如果这样做,静态方法也将起作用:
Pair<Class<?>, String> pair = Pair.<Class<?>, String>of(List.class, "hello");
当然,首先使用静态方法的全部原因可能只是为了获得类型推断(这根本不适用于构造函数)。
这里的问题(如您建议的那样)是编译器正在执行捕获转换。我认为这是[JLS第15.12.2.6条]的结果:
- 所选方法的结果类型确定如下:
- 如果所调用的方法声明为返回类型为void,则结果为void。
- 否则,如果要使该方法适用就必须进行未经检查的转换,则结果类型是该方法的声明的返回类型的擦除(第4.6节)。*否则,如果要调用的方法是泛型的,则对于1in,令Fi为该方法的形式类型参数,令Ai为为该方法调用推断的实际类型参数,并令R为该方法的声明的返回类型。调用。通过将捕获转换(第5.1.10节)应用于R
[F1:= A1,…,Fn:= An]获得结果类型。- 否则,通过将捕获转换(第5.1.10节)应用于方法声明中给定的类型来获得结果类型。
如果您确实想要推断,则一种可能的解决方法是执行以下 *** 作:
Pair<? extends Class<?>, String> pair = Pair.of(List.class, "hello");
变量
pair将具有更宽的类型,这的确意味着要在变量的类型名称中键入更多内容,但至少您无需再强制进行方法调用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)