为了账号安全,请及时绑定邮箱和手机立即绑定

通用参数:只有菱形运算符似乎起作用

通用参数:只有菱形运算符似乎起作用

慕妹3242003 2021-04-09 18:15:23
假设我们有以下代码: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();    }}它可以编译而不会发出警告,并且可以正常执行。然而,如果试图以某种方式定义推断类型return new Sample<>();中get()明确编译器会抱怨。到现在为止,我一直以为Diamond运算符只是一些语法糖,不编写显式类型,因此可以随时用某些显式类型代替。对于给定的示例,我无法为返回值定义任何显式类型以使代码得以编译。是否可以显式定义返回值的通用类型,或者在这种情况下需要菱形运算符?以下是我尝试使用相应的编译器错误显式定义返回值的泛型类型的一些尝试。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 SampleSample.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 Samplereturn new Sample<Sample<>>(); 结果是:Sample.java:6: error: illegal start of type           return new Sample<Sample<>>();                                    ^
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

该JLS只是说:


如果该类的类型实参列表为空(菱形形式<>),则推断该类的类型实参。


那么,是否有一些X可以满足该解决方案的推断?是的。


当然,要明确定义这样的X,您必须声明它:


public static <X extends Sample<X>> Sample<? extends Sample<?>> get() {

    return new Sample<X>();

}

显式Sample<X>与return类型兼容Sample<? extends Sample<?>>,因此编译器很高兴。


返回类型是混乱的事实Sample<? extends Sample<?>>是完全不同的故事。


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信