这个问题与我的上一个问题部分相关。
我有一个代表通用对象集合的通用类:
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>>
或MyCollection<MyObject<Integer>>
)。 - 对这些集合执行一些操作,调用 MyCollection 接口中定义的一些方法。
- 我不想向它添加泛型类型。
在所描述的情况下,不参数化泛型类 MyCollection insied UserClass 是不是一个坏主意?
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 方法而不知道它们的泛型类型?
- 我的设计不好吗?
我希望已经清楚了。几天来我一直在努力解决这个问题,我不知道。请帮我。