为具有泛型参数的java接口方法使用特定的实现类型。如何避免不固定浇铸
我有以下接口
public interface ITransform<T,V> {
V convert(T object) throws Exception;
}
我有一个类,Class1,它使用这个接口作为它的方法参数。但是它需要一个特定的impl类型(ChannelBuffer
)来代替T,如下所示
public static <T,V> V readObject(ChannelBuffer buffer, int length, ITransform<ChannelBuffer, V> transformer)
{
ChannelBuffer buffer = buffer.readSlice(length);
V obj = null;
obj = transformer.convert(buffer);
return obj;
}
我为ITransform接口提供了一个实现类,Class2,如下所示
public class Transformer implements ITransform<ChannelBuffer, Object>{
@Override
public Object convert(ChannelBuffer buffer) throws Exception {
return someObject;
}
}
我面临的问题是,当我想从Class3调用Class1的readObject时,我需要执行未选中的强制转换,如下所示
public <T,V> V readObject(ITransform<T,V> converter)
{
@SuppressWarnings("unchecked")
ITransform<ChannelBuffer,V> decoder = (ITransform<ChannelBuffer,V>) converter;
return class1.readObject(buffer, decoder);
}
Class3本身不能在其readObject方法参数中包含ChannelBuffer
的原因是它正在实现一个接口2方法<T,V> V readObject(ITransform<T,V> converter)
我不想将Interface2方法修改为具有ChannelBuffer
,因为这将把接口的所有实现绑定到ChannelBuffer
# 1 楼答案
# 2 楼答案
1)仅供参考。。。在Java中,强制转换并不像在C中那样不安全。 2) 只需在强制转换之前使用instanceof测试对象是否是正确的类型,就可以避免这种安全性。 3) 接口只是契约。创建另一个界面会有帮助吗? 4) 您可以使readObject方法成为接口的一部分,并通过抛出NotSupportedException使其实现可选
总的来说,您描述的内容通常表明您的模型中存在问题,但我对此无能为力,因为我不知道您的领域
如果我能提供进一步帮助,请告诉我