什么是';好';使用<;的原因&燃气轮机;在Java泛型中?

什么是';好';使用<;的原因&燃气轮机;在Java泛型中?,java,generics,idioms,Java,Generics,Idioms,有时在我的代码中,我发现我可以通过使用裸泛型类或带有通配符的类来解决问题 我有一个设计,其中一个类如下: Class World<T, C> { .... } 或者有时候我会以 World<?, ?> theWorld; World-theWorld; 我这样做是因为它似乎是让编译器接受它和我的 试图避免它们会导致我更多地施放或继承复杂性 在我看来,它丑陋难闻,但我无法证明我需要引入它来避免它的复杂性 有哪些情况(如果有的话)是您认为使用裸泛型或通配符泛型是可以接受

有时在我的代码中,我发现我可以通过使用裸泛型类或带有通配符的类来解决问题

我有一个设计,其中一个类如下:

Class World<T, C> { .... }
或者有时候我会以

World<?, ?> theWorld;
World-theWorld;
我这样做是因为它似乎是让编译器接受它和我的 试图避免它们会导致我更多地施放或继承复杂性

在我看来,它丑陋难闻,但我无法证明我需要引入它来避免它的复杂性

有哪些情况(如果有的话)是您认为使用裸泛型或通配符泛型是可以接受的惯用Java?

任何时候您都可以使用泛型,但在特定情况下不需要它<代码>粗略地告诉编译器:“我知道泛型,但现在不需要该类型”

可能在其他情况下需要该类型。例如,如果你有一个
集合
,它只存储任何东西,比如缓存,而你根本不关心元素的类型。在其他时候,当您处理特定元素时,您会这样做

如果您使用的类型参数太松散(如非常松散的
),但随后尝试确定类型,例如使用
instanceof
或某些自定义类型鉴别器,则会发出异味。然后一些东西设计得很糟糕。

在泛型教程的部分中有一个使用
的好例子(用例)

排序摘要:如果要编写一个
printCollection
方法,该方法接受所有类型的
Collection
,可以使用
Collection
作为参数类型。不能将
集合
用作此用途的参数类型,因为它不是所有类型集合的超类型


在这种情况下,使用
Collection
而不是“纯”
Collection
更安全,因为在
printCollection
方法中不能向
Collection
添加项(null除外)。

当您要存储多个对象时,通配符也非常有用,这些对象是另一个类的子类

例如:

Collection<? extends Shape> myShapes

有趣!我试过“收藏a”,发现这是无效的。所以用“?”代替!T只有在实现它的类本身是泛型的情况下才有效,这意味着一旦该类的对象被实例化,VM就会知道T。。。除了我没有遵循“您不能将Collection用作此用途的参数类型,因为它不是所有类型集合的超类型。”。。。我会认为你不能这样做的原因是一个集合与一个集合是不同的。然而,一个集合。你能确认吗?收集和收集
Collection<? extends Shape> myShapes
myShapes.add(new Rectangle())
myShapes.add(new Triangle())