我无法解释为什么这个简单的代码无法编译。
class Foo {
<T extends Foo> T method() {
return this;
}
}
错误是:Type mismatch: cannot convert from Foo to T
。
为什么不?T
定义为Foo
或其子类。
更新:我在Java教程中找到了关于泛型方法的简短建议。
通用方法允许使用类型参数来表示方法的一个或多个参数的类型和/或其返回类型之间的依赖性。如果没有这种依赖性,则不应使用通用方法。
我的解释是,通用方法仅适用于两种情况。
显然,所讨论的简单代码的参数和返回类型之间没有依赖关系,因为没有参数。因此,通用方法是不合适的。
UPDATE2:现在我知道了,我注意到开源项目中这种反模式的示例。
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) 函数应知道预期的返回参数类型。 我的尝试: 因为没有生成的实例,所以它不起作用。尝试使用