当前位置: 首页 > 知识库问答 >
问题:

T[]作为Java8中的返回类型

孔建柏
2023-03-14

我正在看一些在java 7编译但在Java8编译失败的代码。

class Test {
    public <T extends Enum<T>> T[] doSomething(...) {...}

    public <T extends Enum<T>> T[] methodWhichCallsDoSomething() {
        ...
        return doSomething(...);
}

错误如下:

incompatible types: inference variable T has incompatible upper bounds java.lang.Enum<T>,T

我正在运行jdk 1.8.071。

有人知道在Java8中编译和工作的变通方法或解决方案吗?

编辑:错误消息是为调用do某物()的行提供的,为括号前的co提供的。

共有1个答案

卢宜然
2023-03-14

问题是由您传递给doSomething的内容引起的。您没有发布实际的参数,但从签名我们可以推断,如果doSomething的参数中至少有一个以任何方式引用了t,那么调用doSomething的方法不可能提供正确的参数(除非所有参数都null),因为范围内没有合适的变量。

编译的代码很可能是由于编译器错误或未检查的操作,在这两种情况下,确实有可能由于新的类型推断规则而改变了这种行为。

methodWhichCallsDoSomething()这样的无参数方法promise返回调用方希望返回的任何T[],但无论如何都会被破坏。类似的反模式有几个例子,现在在Java8下失败了,比如这个和这个。如果这种代码碰巧在早期版本中工作,那么它碰巧是在意外情况下工作的,而现在出现的问题实际上以前就已经存在了。

对于这种被破坏的代码,现在得到一个编译器错误,是更好的可能症状,因为有时代码仍然在编译,但会在运行时突然中断。

 类似资料:
  • 现在我学习Java已经有一段时间了,但有一个概念我很难理解。我习惯了这样的方法 我知道上面的方法会返回一个整数或字符串,无论你想要什么数据类型 现在我在问自己,上述方法的回报类型到底是什么。我如何使用返回的东西做其他事情? 我还看到人们将对象作为这样的参数传递给方法 这又是怎么回事?在什么情况下,上述“风格”是必要的,需要避免什么陷阱? 使用对象而不是整数之类的值让我感到困惑。

  • 我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。 我的假设是做一个像这样的抽象函数: RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆

  • 我正在讨论设计我们的API(Stream vs Collection作为返回类型)的最佳方式。这篇文章中的讨论非常有价值。 @BrainGotez的答案提到了一个条件,即集合优于流。我不太明白这意味着什么,谁能帮我举个解释的例子? 当有很强的一致性要求时,您必须生成移动目标的一致快照 我的问题是,具体而言,“强一致性要求”和“移动目标的一致快照”在现实应用中意味着什么?

  • 问题内容: 在python 3中,我可以设置参数并返回类型注释。例: 问题是我无法使用当前类(图形)的返回类型进行注释,该类型尚未定义。例: 这段代码有错误 这些注释对于记录文档以及允许IDE识别参数和返回类型都非常有用=>启用自动完成功能 UPD:所以我想到的是这是不可能的,或者需要一些我不喜欢的技巧,所以我决定使用 可以理解的文档,尽管这违反了规则。缺点是它不适用于IDE自动完成功能。 问题答

  • 我正试图从使用observable转换下面的observable代码。使用可管道操作符创建到。 我已经尝试了下面的方法,但是我得到了一个转换错误,无法转换可观察的类型。看不见的。如有任何帮助,我们将不胜感激。