首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型参数:似乎只有菱形运算符有效

泛型参数:似乎只有菱形运算符有效
EN

Stack Overflow用户
提问于 2018-06-20 04:17:53
回答 2查看 2.1K关注 0票数 16

背景:这个问题出现在this answer中(确切地说,是答案的第一个修订版)。这个问题中提供的代码被减少到最低限度来解释这个问题。

假设我们有以下代码:

代码语言:javascript
运行
复制
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();
    }
}

它在没有警告的情况下编译,并且执行得很好。然而,如果有人试图以某种方式在get()中显式地定义return new Sample<>();的推断类型,编译器就会抱怨。

到目前为止,我的印象是菱形运算符只是一些语法糖,不需要编写显式类型,因此总是可以用一些显式类型替换。对于给定的示例,我无法为返回值定义任何显式类型来编译代码。是否可以显式定义返回值的泛型类型,或者在这种情况下是否需要菱形运算符?

下面是我用相应的编译器错误显式定义返回值的泛型类型的一些尝试。

return new Sample<Sample>的结果是:

代码语言:javascript
运行
复制
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<?>>的结果是:

代码语言:javascript
运行
复制
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<>>();的结果是:

代码语言:javascript
运行
复制
Sample.java:6: error: illegal start of type
           return new Sample<Sample<>>();
                                    ^
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50936309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档