实现没有接口类型参数的接口

时间:2017-10-13 15:20:08

标签: java apache-storm

Apache Storm有一个带有无类型Map的接口IBasicBolt

//org.apache.storm.topology.IBasicBolt
public interface IBasicBolt extends IComponent {
    void prepare(Map stormConf, TopologyContext context);
    ...
}

我想在抽象类中添加一个类型化的地图

public abstract class MyClass implements IBasicBolt {
    @override
    public void prepare(Map<String, Object> stormConf, TopologyContext context) {
    }
}

如果没有将<String, Object>添加到风暴类中,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

Adapter pattern适用于此类情况,但在您的使用案例中可能并不完全是您所追求的。但这是一个值得了解的模式,可能会引导你朝着正确的方向前进。

<强>意图

将类的接口转换为客户期望的另一个接口。适配器允许类一起工作,否则由于不可比的接口而无法使用。

示例

因此,请考虑目标界面,即您希望编程的目标界面:

public interface IMyBasicBolt {    
    void prepare(Map<String, Object> stormConf, String other);    
}

(注意:为简单起见,我已将TopologyContext替换为String

然后,您可以创建一个实现目标接口的适配器类,并将行为(组合)委托给IBoltBasic的实现。

public class BasicBoltAdapter implements IMyBasicBolt {

    private IBasicBolt basicBolt;

    public BasicBoltAdapter(IBasicBolt basicBolt) {
        this.basicBolt = basicBolt;
    }

    @Override
    public void prepare(Map<String, Object> stormConf, String other) {
        basicBolt.prepare(stormConf, other);
    }    

}

使用适配器BasicBoltAdapter的示例:

IBasicBolt basicBolt = new IBasicBolt() {

    @Override
    public void prepare(Map stormConf, String other) {
        System.out.println(stormConf.toString() + " " + other);
    }
};
Map<String, Object> map = new HashMap<>();
map.put("MapKeyTest", new Object());
IMyBasicBolt myBasicBolt = new BasicBoltAdapter(basicBolt);
myBasicBolt.prepare(map, "Test");

在您的情况下,并不需要接口IMyBasicBolt(您的目标接口)。但是在可能的情况下编程到接口通常会很好。