这个问题与我的上一个问题部分相关question https://stackoverflow.com/questions/7300163/java-generic-programming-with-unknown-generic-type-of-interface.
我有一个泛型类,表示泛型对象的集合:
public interface MyObject<N extends Number>{}
public interface MyCollecion<N extends Number> {
public foo(MyObject<N> obj)
}
在我的设计中,这些对象集合是由客户端类(我们称之为 CollectionBuilder)通过抽象类方法构造的:
public interface AbstractCollectionFactory {
public abstract <N extends Number> MyCollection<MyObject<N>> createCollection(String collectionType);
}
通用集合应该这样构建:
public class CollectionBuilder{
AbstractCollectionFactory f;
public void buildDoubleCollection(){
MyCollection<MyObject<Double>> c = f.<Double>createCell("MyType");
}
public void buildIntegerCollection(){...}
}
好吧,既然这里一切都好。 CollectionBuilder 知道要指定的通用具体类型(在本例中为 Double)并且可以正确构建。我可以在没有警告的情况下编译它,并且一切都应该正常工作。
现在我有一个与泛型和程序设计相关的问题。
我的应用程序中有另一个类需要使用 CollectionBuilder 构建的集合(我们将此类称为 UserClass)。
用户类:
- 不需要知道它的集合是哪个特定的具体类型(
MyCollection<MyObject<Double>>
or MyCollection<MyObject<Integer>>
).
- 调用 MyCollection 接口中定义的一些方法对这些集合执行一些操作。
- 我不想向其中添加泛型类型。
在所描述的情况下,不对 UserClass 中的泛型类 MyCollection 进行参数化是一个坏主意吗?
public UserClass{
MyCollection a; //warning
MyCollection<?> b; //no warning
public method(MyObject o){ //warning
a.foo(b); //compile
}
public method2(MyObject<?> o){
b.foo(o); //error do not compile
}
}
如果我不指定泛型参数,Java 编译器总是会发出警告抗议。无论如何,从 UserClass 内部我不知道具体参数(我想不知道),甚至用“?”来声明它。不允许我在 MyCollection 上调用方法 foo。
所以问题是:
- 不参数化对泛型类型的引用总是一件坏事?
- 如果 1 的答案是否定的,那么这是不这样做的正确情况吗?
- 如果 1 的答案是“是”,我如何在不知道 UserClass 内部的泛型类型的情况下使用 MyCollection 方法?
- 我的设计很糟糕吗?
我希望已经说清楚了。我几天来一直在为这个问题苦苦挣扎,但我不知道。请帮我。