通用参数:似乎只有金刚石运算符可以工作
背景:这个问题出现在这个答案中(确切地说,是答案的第一个修订版)。这个问题中给出的代码被简化为最低限度来解释问题。
假设我们有以下代码:
public class Sample<T extends Sample<T>> {
public static Sample<? extends Sample<?>> get() {
return new Sample<>();
}
public static void main(String... args) {
Sample<? extends Sample<?>> sample = Sample.get();
}
}
它可以在没有警告的情况下编译并执行良好。但是,如果试图以某种方式显式定义 in 的推断类型,编译器就会抱怨。return new Sample<>();
get()
到目前为止,我的印象是,钻石运算符只是一些语法糖,不写显式类型,因此总是可以用一些显式类型替换。对于给定的示例,我无法为返回值定义任何显式类型以进行代码编译。是否可以显式定义返回值的通用类型,或者在这种情况下是否需要菱形运算符?
以下是我为显式定义返回值的泛型类型以及相应的编译器错误所做的一些尝试。
return new Sample<Sample>
结果:
Sample.java:6: error: type argument Sample is not within bounds of type-variable T
return new Sample<Sample>();
^
where T is a type-variable:
T extends Sample<T> declared in class Sample
Sample.java:6: error: incompatible types: Sample<Sample> cannot be converted to Sample<? extends Sample<?>>
return new Sample<Sample>();
^
return new Sample<Sample<?>>
结果:
Sample.java:6: error: type argument Sample<?> is not within bounds of type-variable T
return new Sample<Sample<?>>();
^
where T is a type-variable:
T extends Sample<T> declared in class Sample
return new Sample<Sample<>>();
结果:
Sample.java:6: error: illegal start of type
return new Sample<Sample<>>();
^