实现不带接口类型参数的接口

实现不带接口类型参数的接口

问题描述:

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);  
} 

(注:我已经取代TopologyContextString为简单起见)

你然后可以创建一个适配器类来实现您的目标接口并将行为(组合)委托给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(目标接口)。但是,如果可能的话,编程到接口通常是很好的。