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

Implementing an interface without an interface type parameter

Apache Storm 有一个接口 IBasicBolt,带有一个未类型化的映射。

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

我想在我的摘要中添加类型化地图 class,

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

有没有什么办法不把<String, Object>加入风暴class?

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

意图

将class的接口转换为客户期望的另一个接口。适配器让 class 由于接口不兼容而无法协同工作。

例子

因此请考虑目标接口,即您希望编程到的接口:

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

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

然后您可以创建一个适配器 class 来实现您的目标接口并将行为(组合)委托给 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(您的目标接口)。但通常最好在可能的情况下对接口进行编程。