在java中使用未指定的通用通配符

时间:2011-09-09 10:20:16

标签: java generics

我希望用Java实现模块化通用对象工厂。

我的代码将包含三个基本元素:

  1. DataLoader,它将提供通用集合
  2. 工厂,给定元素T,返回类型为U
  3. 的对象
  4. 将两者联系在一起的类,并提供集合
  5. 我苦苦挣扎的是第3类并不关心类型T.重要的是工厂和DataLoader使用相同的T - 即,构建器可以使用DataLoader提供的原始数据来构建第三类提供的对象 - 但第三类并不关心中间格式是什么。

    那么我如何强制要求泛型类型T对于1和2是相同的,而该类型不属于3的规范?

3 个答案:

答案 0 :(得分:2)

一种选择是使用带有两个类型参数的helper类将数据加载器和工厂绑定在一起,然后将该帮助器包装在另一个不关心原始数据加载器类型的类中:

public class DataLoader<T> {
    ...
}

public class Factory<T, U> {
    ...
}

public class Binder<T, U> {
    public Binder(DataLoader<T> dataLoader, Factory<T, U> factory) {
        ...
    }
}

public class ClassNumber3<U> {
    public ClassNumber3(Binder<?, U> binder) {
        ...
    }
}

您甚至可以通过赋予Binder通用构造函数来隐藏外部代码中ClassNumber3的存在:

public class ClassNumber3<U> {
    Binder<?, U> binder;
    public <T> ClassNumber3(DataLoader<T> dataLoader, Factory<T, U> factory) {
        binder = new Binder<T, U>(dataLoader, factory);
        ...
    }
}

答案 1 :(得分:0)

只需为您的三个类使用不同的形式参数类型,并在使用它们时根据需要绑定它们。

也许Cannot convert from Node<E> to Node<E>?会有所帮助 - 它显示了如何为不同的类使用不同的形式类型参数,并在以后绑定它们。

答案 2 :(得分:0)

这样的东西?

    public class ClassNumber3 {
        public <T> Collection<T> tieBoth(DataLoader<T> dl, Factory<T,U> fact){

        }
    }