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

假设我们有以下代码:


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 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<>>();

                                    ^


慕妹3242003
浏览 159回答 2
2回答

慕的地10843

该JLS只是说:如果该类的类型实参列表为空(菱形形式<>),则推断该类的类型实参。那么,是否有一些X可以满足该解决方案的推断?是的。当然,要明确定义这样的X,您必须声明它:public static <X extends Sample<X>> Sample<? extends Sample<?>> get() {&nbsp; &nbsp; return new Sample<X>();}显式Sample<X>与return类型兼容Sample<? extends Sample<?>>,因此编译器很高兴。返回类型是混乱的事实Sample<? extends Sample<?>>是完全不同的故事。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java