java - 从 Interface<Type> 到 Interface<Subtype> 的适配器

标签 java generics casting wrapper

考虑以下界面。

public interface Feed<T> {

    public void put( T o );

}

我们有一个实现此接口(interface)的简单 Java 类,它将对象写入特定集合。

public class CollectionFiller<T> implements Feed<T> {

    private final Collection<T> collection;

    private CollectionFiller( Collection<T> collection ) {
        this.collection = collection;
    }

    public void put( T o ) {
        this.collection.add( o );
    }

    public static <T> CollectionFiller<T> of( Collection<T> collection ) {
        return new CollectionFiller<T>( collection );
    }

}

现在我们定义两个虚拟类,以使问题具体化。

public class Super {}

public class Sub extends Super {}

假设有一些方法 writeSubsTo( Feed<Sub> f )我们有一个实例 cfCollectionFiller<Super> .自 cf只将对象添加到它的“ super ”集合中,将它传递给 writeSubsTo 是安全的.但是编译器不允许。 (我很清楚这种行为的原因。)

我想编写一个围绕 CollectionFiller 的便捷适配器类型 X 并构成 Feed X 类型的特定子类型。我尝试了(除其他外)以下内容,但编译器给我带来了麻烦。

class SubFiller<T1, T2 extends T1> implements Feed<T2> {

    private final CollectionFiller<T1> collectionFiller;

    SubFiller( CollectionFiller<T1> collectionFiller ) {
        this.collectionFiller = collectionFiller;
    }

    public void put( T2 o ) {
        this.collectionFiller.put( o );
    }

    public static <T1, T2 extends T1> SubFiller<T1, T2> of( CollectionFiller<T1> c ) {
        return new SubFiller<T1, T2>( c );
    }

}

虽然这个类没有任何问题,但编译器不会接受以下代码片段中的最后两个语句。

CollectionFiller<Super> cf = CollectionFiller.of( new HashSet<Super>() );
SubFiller<Super, Sub> sf = SubFiller.of( cf );
writeSubsTo( SubFiller.of( cf ) );

谁能想出解决这个问题的好方法?我不介意适配器是否包含繁琐的代码,只要使用它不是太冗长(因此是静态工厂方法)。当然,任何其他解决方案(不使用适配器)也可以(同样,只要使用它不是太冗长)。

最佳答案

如果您使用 writeSubsTo(Feed<? super Sub> f) , 那么你可以传入一个 Feed<Super> .然后你可以完全取消你的填充类。为逆变而欢呼! :-P

(还有一个协变版本,? extends X,用于输出值而不是输入值的情况。)

关于java - 从 Interface<Type> 到 Interface<Subtype> 的适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7402919/

相关文章:

java - 返回类型之前泛型的目的是什么

c# - 在 C# 中,如何在给定类型名称的情况下创建对象?

java - 如何使用webview获取最后更新的HTML内容?

java - 为什么在 JSP 中需要 pageContext?

java - 有没有办法在父类(super class)中定义泛型方法来引用继承类的类型?

generics - 如何实现为通用枚举实现通用特征的过程宏?

c++ - 通过转换为 Visual C++ 中的函数指针来执行 shellcode

c++ - 将字节数组转换为 float

java - 在不同的目录中使用类文件

java - 在微服务架构中管理与 MongoDb 的关系