繁体   English   中英

Java字段类型是否为一般递归自我类型的值?

[英]Java field type for a value of a generically recursive self-type?

给定一个类层次结构,其中基类定义递归自我类型:

abstract class A<T extends A<T>> { }

我怎样才能声明另一个类(在T中不应该是通用的,因为这样的T可能在对象的生命周期内变化),并且一个字段可以包含A的任何子类?

以下不起作用:

public class B {
    //fails to compile, because the capture of ? is not sufficiently narrow
    private A<?> a;

    public <T extends A<T>> setA(T a) {
        this.a = a;
    }
}

- 问题结束 -

我注意到一些StackOverflow成员倾向于接近某些难题,“你为什么要这样做呢?” 以下是我使用此模式的理由 - 您可以注意到Java标准库在其Enum类的定义中也使用递归自我类型: Enum<E extends Enum<E>> 同样可以将此问题称为“如何定义Enum<?>类型的字段。

理由示例:

abstract class A<T extends A<T>> {
    public abtract T self();
    public B<T> bify(Bifyer bifyer) {
        return bifyer.bify(self());
    }
}

与子类:

class ASub1 extends A<ASub1> { 
    public ASub1 self() { return this; }
}       

class ASub2 extends A<ASub2> { 
    public ASub2 self() { return this; }
}       

绑定到并行类层次结构:

abstract class B<T extends A<T>> {
}

class BSub1<T extends A<T>> implements B<T> { }
class BSub2<T extends A<T>> implements B<T> { }
//and others

并且通过Bifyer接口的实现来管理B实例的生成:

interface Bifyer {
    B<ASub1> bify(ASub1 asub1);
    B<ASub2> bify(ASub2 asub2);        
}

此接口的实现可以为B返回BSub1或BSub2。这实际上是访问者模式的应用,其中Bifyer是访问者,但与标准访问者不同,accept方法返回值而不是void。 这提供了一个模块化框架,可以指定不同的Bifyer实现来为Bify方法提供备用行为和返回类型 - 比如B的每个子类。

如果你绑定了通配符? A下面,它应该工作:

public class B {
    private A<? extends A> a;

    public <T extends A<T>> void setA(T a) {
        this.a = a;
    }
}

暂无
暂无

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

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