java - 覆盖方法;返回具有合并参数的类
问题描述
我正在尝试重写一个返回声明它的类的实例的方法,该方法会在调用该方法的实例和调用返回的实例之间更改类的参数。我希望能够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;
}
}
解决方案
我很确定您实际上并不想要类型化的方法 - 即X
andY
实际上是A
and B
,因此您不应该将类型X
and添加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
.
推荐阅读
- angular - 如何直接从 formControl 获取验证器?
- android - 如何在H264上接听电话和丢失包时修复黑屏
- vba - 过滤和计算 3 列之间的匹配项
- html - 在 Angular Material Web 应用的单个页面上显示普通 HTML 元素
- c++ - 如何在 C++ 中使用 unordered_maps 的 unordered_map?
- python - ARIMA Forecast: Cannot cast ufunc subtract output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
- angular - Angular 2+ 如何使用变量值来调用指令?
- acumatica - UseLegacyUI 设置不起作用
- python - 在列表列表中查找出现在两个列表中的元素
- linux - 如何获取当前文件夹名称并从bash中的名称中删除字符