我希望用Java实现模块化通用对象工厂。
我的代码将包含三个基本元素:
我苦苦挣扎的是第3类并不关心类型T.重要的是工厂和DataLoader使用相同的T - 即,构建器可以使用DataLoader提供的原始数据来构建第三类提供的对象 - 但第三类并不关心中间格式是什么。
那么我如何强制要求泛型类型T对于1和2是相同的,而该类型不属于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){
}
}