![](/img/trans.png)
[英]Using Java generics in an interface to enforce implementation of a method with the implementing type as a parameter
[英]Using specific implementation type for a java interface method having generics parameter. How to avoid uncheked cast
我有以下界面
public interface ITransform<T,V> {
V convert(T object) throws Exception;
}
我有一个使用该接口作为其方法参数的Class1类。 但是,它期望在T处使用特定的impl类型( ChannelBuffer
),如下所示。
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
的原因是,它正在实现Interface2方法<T,V> V readObject(ITransform<T,V> converter)
我不想修改Interface2方法以具有ChannelBuffer
因为那会将接口的所有实现绑定到ChannelBuffer
。
interface Interface2<T>
public <V> V readObject(ITransform<T,V> converter)
class Class3 implements Interface2<CharBuffer>
public <V> V readObject(ITransform<CharBuffer,V> converter)
{
return class1.readObject(converter, decoder);
}
1)FYI ...在Java中,类型转换并不像在C中那样不安全。2)通过简单地使用instanceof在转换之前测试对象是否正确,可以避免安全性。 3)接口只是合同。 创建另一个界面会有所帮助吗? 4)您可以通过抛出NotSupportedException使readObject方法成为接口的一部分,并使它的实现可选
总体而言,您所描述的内容通常表明您的模型存在问题,但由于我不了解您的领域,我对此无能为力。
让我知道我是否可以进一步协助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.