繁体   English   中英

为具有泛型参数的java接口方法使用特定的实现类型。 如何避免不熟练的演员

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM