繁体   English   中英

当具有有限类型参数的类的方法返回其自身类型的值时,如何使返回值保持通用(无强制转换)?

[英]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类型 毕竟, t1T类型的, 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类将其TA

class B<T extends A<T>> {
    public B(T t1) {
        T t2 = t1.getOtherA();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM