Java泛型:重写参数化返回类型不同的方法



我来自.Net,对Java开发很陌生,所以这可能是一个奇怪的问题:

我有一个类层次结构,类似于:

Superclass implements GenericInterface<Superclass>
    ^
    |
 Subclass

其中GenericInterface相当直接:

public interface GenericInterface<T> {
    OtherGenericInterface<T> getOther();
}

CCD_ 2最终使用类型参数:

public interface OtherGenericInterface<T> {
    List<Object> processType(T left, T right);
}

现在,当我尝试在Superclass中实现接口时,我只返回一个匿名类型:

public class Superclass implements GenericInterface<Superclass> {
    @Override
    public OtherGenericInterface<Superclass> getOther() {
        return new OtherGenericInterface<Superclass>() {
            @Override
            public List<Object> processType(T left, T right) {
                ...
            }
        };
    }
}

到目前为止,这很好,但现在我试图覆盖Subclass:中的方法

public class Subclass extends Superclass (implements GenericInterface<Subclass>) {
    @Override
    public OtherGenericInterface<Subclass> getOther() {
        ...
    }
}

在那里,我不能用我更具体的返回类型重写方法。即使我重新实现接口并将超类中的方法声明为final,这也是不可能的。

所以我的问题是:为什么OtherInterface<MoreSpecificType>不是一个更具体的,或者至少是相同的类型(由于类型擦除),因为这将是重写方法的要求?。

这证明了Java泛型的一个常见误解——认为类的匹配也会匹配子类(比如参数类型)。事实并非如此。Java泛型旨在确保类型与完全匹配。如果你想要扭动房间,你必须指定和定义你想要的房间和多少。

这里有一个版本,可以通过将签名精确指定为<T extends Superclass>来执行您想要的操作。这可能不是你想要的,但我希望它能为你指明正确的方向。

public interface OtherGenericInterface<T> {
    List<Object> processType(T left, T right);
}
public interface GenericInterface<T> {
    OtherGenericInterface<T> getOther();
}
public class Superclass<T extends Superclass> implements GenericInterface<T> {
    @Override
    public OtherGenericInterface<T> getOther() {
        return new OtherGenericInterface<T>() {
            @Override
            public List<Object> processType(Superclass left, Superclass right) {
                return null;
            }
        };
    }
}
public class Subclass extends Superclass {
    @Override
    public OtherGenericInterface<Subclass> getOther() {
        return null;
    }
}

最新更新