gpt4 book ai didi

Java 泛型和设计模式 : not parameterizing a reference to a generic type is always a bad thing?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:02 24 4
gpt4 key购买 nike

这个问题和我上一个question有部分关系.

我有一个代表通用对象集合的通用类:

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)。用户类:

  1. 不需要知道它的集合是哪个特定的具体类型(MyCollection<MyObject<Double>>MyCollection<MyObject<Integer>>)。
  2. 调用 MyCollection 接口(interface)中定义的一些方法对这些集合执行一些操作。
  3. 我不想向它添加通用类型。

在所描述的情况下,不将泛型类 MyCollection 参数化到 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 内部我不知 Prop 体参数(我也不想知道),甚至用“?”声明它。不允许我在 MyCollection 上调用方法 foo。

所以问题是:

  1. 不参数化对泛型类型的引用总是一件坏事?
  2. 如果第 1 处的答案是否定的,这是不这样做的正确情况吗?
  3. 如果 1 的答案是肯定的,我如何在不知道其泛型类型的情况下从 UserClass 内部使用 MyCollection 方法?
  4. 我的设计不好吗?

我希望已经清楚了。几天来我一直在努力解决这个问题,但我不知道。请帮助我。

最佳答案

  1. 根据 Java 编译器,是的。和 this answer包含很多关于为什么的好点。我个人不同意某些情况,尤其是在使用 Class 的情况下。很关心(例如,如果你有一个 Map<Class, Object> )。在这种情况下必须始终解决 <?>一直到“Class”的结尾感觉就像是不必要的单调乏味,并且不会使代码更具可读性。

    拥有Class的想法根据与它关联的对象类型进行参数化,对我来说,一开始总是觉得有点可疑。点Class是要有一个通用接口(interface),可用于获取有关任何对象的信息(ala 反射),无论其类型如何。

    但我离题了。根据 Java 编译器和泛型类型的实现者,您应该始终参数化您的引用,即使您只使用 <?>。 .

  2. 不适用。虽然你总是可以不声明任何类型信息,然后使用 @SuppressWarnings("unchecked")以及使编译器满意的显式强制转换。

  3. 查看 Bohemian 的回答。

  4. 没有足够的信息可以说。虽然超出了我的脑海,但我不确定实际用例是什么“代表通用对象集合的通用类”。为什么不直接使用集合?

关于Java 泛型和设计模式 : not parameterizing a reference to a generic type is always a bad thing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7327209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com