歧管和结构

时间:2019-01-11 13:56:47

标签: java extension-methods

我不确定这是问这个问题的正确地方,但是我正在尝试manifold project,并且不确定我尝试实现的方案是否适用于多方面?

我有一个类似following的类(它将由我无法控制的第三方软件创建)。

public ClassA {
    String getUuid();
}

现在我希望此类实现以下接口...

@Structural
public Interface InterfaceA {
    String getUuid();
}

在以下情况下...

public ClassB<GenTypeA extends InterfaceA> {
}

但是当我尝试以下操作时会偏离路线...

ClassB varB = new ClassB<ClassA>();

Java开始抱怨ClassA没有实现InterfaceA。

我想做的事完全可行吗?

寻求答案...

2 个答案:

答案 0 :(得分:2)

这称为Decorator patternAdapter pattern

// Immutable, cannot be changed
public final class ClassA {

    String getUuid() {
        return null;
    }
}

public interface InterfaceA {

    String getUuid();
}

public class ClassB implements InterfaceA {

    private final ClassA delegate;

    public ClassB(ClassA delegate) {
        this.delegate = delegate;
    }

    @Override
    public String getUuid() {
        return delegate.getUuid();
    }
}

答案 1 :(得分:1)

您现在可以在歧管中实现此目的。存在一个阻止此操作的问题:https://github.com/manifold-systems/manifold/issues/35,该问题最近已修复。在0.38-alpha版本中可用。

另一个重要说明。要完成您的示例,您还必须提供ClassA的扩展名,以声明其名义上支持InterfaceA,这仅是在避免强制转换涉及InterfaceA的泛型类型时需要的:

package my_project.extensions.path.to.ClassA;

import manifold.ext.api.Extension;

@Extension
public abstract class MyClassAExtension implements InterfaceA {
} 

了解更多:http://manifold.systems/docs.html#extension-interfaces