Java 对应类型树

Java 对应类型树,java,inheritance,types,Java,Inheritance,Types,我想知道是否有一些聪明的方法可以在Java中创建2个并行类型层次结构。例如,我有一些XTypeXType有自己的类型树(大约10-20个,有些是平面的,有些是三层的) 现在我有一些情况,我想有一个相应的层次结构,但有一些额外的属性。因此,XTypeWithProperty,AXTypeWithProperty 现在,由于只有单一继承,因此AAXTypeWithProperty不可能有父级AXTypeWithProperty和AAXType。。。当然,我可以使用根目录下的XType将所有内容折叠到

我想知道是否有一些聪明的方法可以在Java中创建2个并行类型层次结构。例如,我有一些
XType
XType
有自己的类型树(大约10-20个,有些是平面的,有些是三层的)

现在我有一些情况,我想有一个相应的层次结构,但有一些额外的属性。因此,
XTypeWithProperty
AXTypeWithProperty

现在,由于只有单一继承,因此
AAXTypeWithProperty
不可能有父级
AXTypeWithProperty
AAXType
。。。当然,我可以使用根目录下的
XType
将所有内容折叠到第一棵树,并添加一个
.getProperty()
方法,该方法可以为没有它的类型返回null

但是我想在这里找到一个类型安全的(Java可以管理的)解决方案。我考虑过创建泛型类型
XType
XType
并使用它们进行操作。。。但看起来维护起来有点乏味


有更好的方法吗?

您可能会对的感兴趣,它可能会帮助您解决问题。EclipseIDE在内部使用它来维护Java模型树和资源模型树,然后在这两棵树之间调整元素。或者,您可以使用或查看注射。

恐怕您需要在此处使用委派。例如:

public class WithProperty<T extends XType,P> {
    private T object;
    private P property;

    public WithProperty(T obj) {
        this.object = obj;
    }

    public T getObject() {
        return object;
    }

    public P getProperty() {
        return property;
    }

    public void setProperty(P property) {
        this.property = property;
    }
}
带有属性的公共类{
私人T对象;
私有财产;
公共财产(T obj){
this.object=obj;
}
公共T getObject(){
返回对象;
}
公共P getProperty(){
归还财产;
}
公共无效集合属性(P属性){
this.property=属性;
}
}

基本上,你所说的是课堂上的混合

在纯Java中,混入是不可能的,标准的Java解决方案是使用策略或适配器模式(参见其他答案)

或者您可以使用AspectJ生成“真实”的混合


现在,
com.yourpackage
中的所有类都实现了
Foo
并共享相同的默认行为。

要清楚,type
AXType
AXTypeWithProperty
之间的唯一区别是存在一个额外的getter和setter?回答得很好。省得我打字了
public class WithProperty<T extends XType,P> {
    private T object;
    private P property;

    public WithProperty(T obj) {
        this.object = obj;
    }

    public T getObject() {
        return object;
    }

    public P getProperty() {
        return property;
    }

    public void setProperty(P property) {
        this.property = property;
    }
}
public interface Foo{
    void isItTrue();
}
public aspect MixinAspect{
  interface FooMixin extends Foo{}
  public void FooMixin.isItTrue(){
      System.out.println("Yup, I'm a mixin");
  }
  declare parents: com.yourpackage..* implements Mixin;
}