[英]In java what is the purpose of NonWildcardTypeArguments following the new keyword?
我正在查看java 语言规范,并看到了这种编写创建者的方式:
Creator:
NonWildcardTypeArguments CreatedName ClassCreatorRest
在纯代码中:
new <Integer> String("1");
// or
new <String,Integer> Integer(5);
//or
new <Constructor,String,Integer> ArrayList<String>(5);
在每个示例中,据我所知,class 列表没有用。 当新关键字之后的类型列表起作用时,你能给我一个例子吗?
除非您遇到非常奇特的 java 类型变量构造函数的语法构造函数,否则此功能无效。 本质上,您永远不应该这样做。 它是为了语言的完整性,可能永远不应该添加到 java 中。
您可以将类型参数定义放在类上,这是最常见的模式。 例如ArrayList
有一个类型变量; 声明如下:
class ArrayList<E> implements List<E> { ... }
第一个<E>
声明有一些没有边界的类型E
然后立即使用它(第一个<E>
和第二个<E>
看起来相同,但是一个声明了 var 类型,另一个是 var 类型的用法,因此它们完全不同。到目前为止一切都很好。
但是您也可以直接在方法上声明它们。 例如:
public static <E> coalesce(E... items) {
for (E item : items) if (item != null) return item;
return item;
}
可以使用尽可能多的 object 引用来调用此方法,并将返回第一个不是null
的引用,并且调用的类型将是所有参数中的公分母。 换句话说,这将编译:
String x = coalesce(null, someString, "defaultValue");
而如果我们写了它:
public static Object coalesce(Object... items) {
for (E item : items) if (item != null) return item;
return item;
}
然后,虽然coalesce(null, someStringRef, "default")
显然必须返回一个String
,但编译器不知道这一点,因此String x = coalesce(..)
不会编译。 你必须注入演员表。 generics 的重点是不必这样做。
构造函数也可以使用相同的功能(方法类型参数):
public class Example<T> {
public <A> Example(A first, A second) {
}
}
是合法的 java。 很难想出一个你想要构造函数 generics 的情况。 构造函数没有返回类型,关键是 typeparam 只是构造函数需要,一旦你完成它就会停止所有相关性(如果它与实例本身相关,你会把它放在类型上,就像上面示例中的<E>
一样)。 因此,为什么您从未在 java 代码中有效地看到它。 不过,如果您要编写它,并且您不希望javac
推断 generics 而是想明确说明它,那么您正在阅读的语法就是您将如何做到这一点:
new <String>Example<Integer>("a", "b");
将调用该构造函数并强制A
为String
, E
为Integer
。
JLS 中有大量奇怪且令人困惑的构造,没有人使用过。 因此,通读 JLS 通常不是一个好主意,您会学到一些东西,但这是一种非常低效的学习方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.