首页 > 解决方案 > 覆盖方法;返回具有合并参数的类

问题描述

我正在尝试重写一个返回声明它的类的实例的方法,该方法会在调用该方法的实例和调用返回的实例之间更改类的参数。我希望能够Overriding_Attempt从覆盖方法返回类的实例。

我不清楚为什么Overriding_Attempt<X>不等于DuoClass<X,ContainerClass<X>>在声明中给出扩展名Overriding_Attempt。我希望能够返回这个更具体的DuoClass<X,ContainerClass<X>>. 我得到的错误是The return type is incompatible with DuoClass<A,ContainerClass<A>>.methodToOverride()

此问题与此处发布的嵌套参数问题非常相关。

另请注意:删除参数 Y from 的声明Overriding_Attempt似乎会导致签名不匹配,从而导致错误变为Name clash: The method methodToOverride() of type Overriding_Attempt<A> has the same erasure as methodToOverride() of type DuoClass<A,B> but does not override it. 我需要声明一个未使用的参数似乎很奇怪,但这不是我的主要问题。

public class SomeClass {
    
}

public class ContainerClass<A extends SomeClass> {
    
}

public class DuoClass<A extends SomeClass, B extends ContainerClass<A>> {
    
    public <X extends SomeClass, Y extends ContainerClass<X>> DuoClass<X,Y> methodToOverride(X field) {
        return null;
    }
    
}

public class Overriding_Attempt<A extends SomeClass> extends DuoClass<A,ContainerClass<A>> {
    //Error Here: The return type is incompatible with DuoClass<A,ContainerClass<A>>.methodToOverride()
    public <X extends SomeClass, Y extends ContainerClass<X>> Overriding_Attempt<X> methodToOverride(X field) {
        return null;
    }
}

标签: java

解决方案


我很确定您实际上并不想要类型化的方法 - 即XandY实际上是Aand B,因此您不应该将类型Xand添加Y到方法中。

鉴于此,您需要一个自引用类型:

public class DuoClass<A extends SomeClass, B extends ContainerClass<A>, T extends DuoClass<A, B, T>> {
    public T methodToOverride(A field) {
        return null;
    }
}

public class Overriding_Attempt<A extends SomeClass> extends DuoClass<A, ContainerClass<A>, Overriding_Attempt<A>> {
    public Overriding_Attempt<A> methodToOverride(A field) {
        return null;
    }
}

您面临的通用“结”是编译器不知道返回类型与声明类DuoClass<A, B>同一个类-理论上它可以是任何子类,但您希望它是声明类。

通过为声明类型添加额外的类型,您可以锁定对声明类型的引用,并且可以将其引用为T.


推荐阅读