当前位置: 首页 > 面试题库 >

具有通用返回类型的方法中的Java编译错误

李利
2023-03-14
问题内容

我无法解释为什么这个简单的代码无法编译

class Foo {
    <T extends Foo> T method() {
        return this;
    }
}

错误是:Type mismatch: cannot convert from Foo to T
为什么不?T定义为Foo或其子类。

更新:我在Java教程中找到了关于泛型方法的简短建议。

通用方法允许使用类型参数来表示方法的一个或多个参数的类型和/或其返回类型之间的依赖性。如果没有这种依赖性,则不应使用通用方法。

我的解释是,通用方法仅适用于两种情况。

  1. 方法的两个(或多个)参数类型之间存在依赖关系。
  2. 方法的返回类型与其一个(或多个)参数类型之间存在依赖关系。

显然,所讨论的简单代码的参数和返回类型之间没有依赖关系,因为没有参数。因此,通用方法是不合适的。

UPDATE2:现在我知道了,我注意到开源项目中这种反模式的示例。

  • co.cask.cdap.api.data.DatasetContext.getDataset()
  • org.kitesdk.data.Datasets.load()
  • com.fasterxml.jackson.databind.ObjectMapper.valueToTree()

UPDATE3:我认为我发现了不涉及多个参数或返回类型的通用方法的要求。多重继承似乎是Java教程中上述规则的例外。

<T extends Foo & Bar> void method(T foobar) {
    // Call Foo method.
    // Call Bar method.
}

值得注意的是,Collectors实用程序类包括toList()不带参数的通用方法。在这种情况下,通用类型仅对返回类型进行参数化,这可能比实际用作返回类型的通用类型更安全。


问题答案:

我认为您误解了Java泛型的工作原理

<T extends Foo> T method() {

这意味着该方法的 调用者 可以选择Foo他们想要的任何子类型并提出要求。例如,你可以写

Foo foo = new Foo();
SubFoo subfoo = foo.<SubFoo>method();

…并期望SubFoo返回,但是您的method实现无法返回SubFoo,而这将失败。(我不会讲Scala,但是我认为这意味着您的Scala实现实际上不是“等效的”。)

如果你希望你的方法能够返回的子类型Foo实现 选,而不是调用者,那么就写

Foo method() {
  return this;
}


 类似资料:
  • 问题内容: 假设我有一个超类,它定义了以下抽象方法 现在,如果我想在某些子类中覆盖它 我收到有关类型安全和未经检查的转换的警告: 类型安全:返回类型为从类型需要选中转换,以符合从类型 没有下摔倒,如果?有什么办法可以适当消除警告吗? 问题答案: 重写方法的返回类型必须是重写方法的返回类型的子类型。 不是where 的子类型。T在这里未知。 是每个子类型化规则的的子类型。 有关通配符的一些子类型化规

  • 问题内容: 这就是我想要做的。使用反射,我想获取所有方法及其返回类型(非泛型)。我一直在这样做。但是,当我遇到返回类型未知的方法时,我遇到了限制。 我如何知道方法的返回类型是否通用?我没有奢求在运行时拥有对象。我正在尝试使用Google 或使用抽象类来获取类型信息。我想关联到对象的方法。 有人认为Java不保留通用信息。在这种情况下,为什么第一次强制转换有效而第二次强制转换无效。 任何帮助表示赞赏

  • 问题内容: 我读过一本书,说如果签名相同,我可以覆盖一个方法。根据书中的方法签名是Method_Name + Parameters传递的。 根据这本书,我可以重写具有不同返回类型的方法。在Java中实际上是否可以覆盖具有不同返回类型的方法?因为我在网上进行了一些搜索,所以我发现有人说要覆盖方法,返回类型也应该相同。 根据这本书,它还说,当我们尝试重载具有相同方法名称和参数但返回类型不同的方法时,j

  • 我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名。根据这本书,方法的签名是Method_Name参数传递。 根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同。 根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?

  • 这个问题与这个问题很接近,但有一个主要区别。 可能的要求: (1) 我想生成一个带有通用返回值的Java函数。 (2)输入参数列表总是相同的。( (3) 函数应知道预期的返回参数类型。 我的尝试: 因为没有生成的实例,所以它不起作用。尝试使用