有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为具有泛型参数的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


共 (2) 个答案

  1. # 1 楼答案

    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);
        }
    
  2. # 2 楼答案

    1)仅供参考。。。在Java中,强制转换并不像在C中那样不安全。 2) 只需在强制转换之前使用instanceof测试对象是否是正确的类型,就可以避免这种安全性。 3) 接口只是契约。创建另一个界面会有帮助吗? 4) 您可以使readObject方法成为接口的一部分,并通过抛出NotSupportedException使其实现可选

    总的来说,您描述的内容通常表明您的模型中存在问题,但我对此无能为力,因为我不知道您的领域

    如果我能提供进一步帮助,请告诉我