实现不带接口类型参数的接口
问题描述:
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>
风暴类?
答
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
(目标接口)。但是,如果可能的话,编程到接口通常是很好的。