[英]How to let the return value remain generic (without casting) when a method of a class with a bounded type parameter returns a value of its own type?
我有一个类A
包含类型的字段A
(类似的方式Node
在一个链表的实现有一个Node nextNode
),如下所示:
public class A {
private A otherA;
public A getOtherA() {
return otherA;
}
}
然后,我有一个类B
,其类型类型参数为<T extends A>
,它试图将getOtherA()
的返回值分配给类型T
的变量:
public class B<T extends A> {
public B(T t1) {
T t2 = t1.getOtherA();
}
}
上面的代码在该行产生错误
T t2 = t1.getOtherA();
并读为
Incompatible types. Required T, Found A.
我的问题是如何(如果可能)修改代码,以便将getOtherA()
的返回值视为T
类型 。 毕竟, t1
是T
类型的, T
扩展了A
并且getOtherA()
仅返回与其所属对象相同类型的对象。 那么,为什么T#getOtherA()
没有返回类型T
呢?
在我看来,我的编译器应该满足于t1.getOtherA()
始终返回类型T
的对象,但是我怀疑我对泛型有误解,在这种情况下,我会硬着头皮,将每个对象都t1.getOtherA()
我想要的类型。
该错误是因为getOtherA()
返回A
,不一定是T
如果您将A
泛型(类型参数用作A
类本身),则可以满足您的需求。
// Introduce type parameter T, upper bound itself.
class A<T extends A<T>> {
protected T otherA; // now of type T
public T getOtherA() { // now returns T
return otherA;
}
}
A
任何子类都可以作为类型参数提供:
class ASub extends A<ASub> {
// Implementation
}
或者,他们可以使用类似的约束声明自己的类型参数:
class ASub<T extends ASub<T>> extends A<T> {
// Implementation
}
这意味着可以键入getOtherA
以返回其自身类型的对象。
B
类将其T
给A
class B<T extends A<T>> {
public B(T t1) {
T t2 = t1.getOtherA();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.