在泛型方法中不能返回超类型

时间:2014-08-09 07:24:55

标签: java generics

一些示例代码:

public class Main {
    class SomeType {

    }
    class A {
        protected <T extends SomeType> T createSomething()
        {
            return null; // Don't worry about this.
        }
    }
    class B extends A {
        @Override
        protected <T extends SomeType> T createSomething()
        {
            SomeType orig = super.createSomething();
            // do some stuff with orig
            return orig;
        }
    }
}

我在这里弄错了什么?

在线

return orig;

编译器吐出错误

Type mismatch: cannot convert from Main.SomeType to T

感谢<T extends SomeType>,我们可以确定T始终是SomeType的子类型,对吧?那么为什么我不能只返回超类型SomeType

我已经阅读了<? extends SuperType> cannot be applied to SuperTypeExplanation of the get-put principle,但我不知道它是如何应用的。

1 个答案:

答案 0 :(得分:6)

  

感谢<T extends SomeType>,我们可以确定T始终是SomeType的子类型,对吧?

右。

  

那么为什么我只能返回超类型SomeType

因为它可能不是T

这样说 - 假设SomeTypeObjectTString。您建议此代码应该有效:

String foo() {
    return new Object();
}

它以其他方式运行 - 您可以为声明为返回超类型的方法返回子类型引用,但是&#39 ;不同。

虽然修复很简单 - 只需将orig更改为T类型:

T orig = super.createSomething();

然后它编译没有任何问题。