我读过整SCJP6书Sierra和贝茨书,取得了88%的考试。
但是,我从来没有听说过这样的代码是如何工作的,因为它不是在泛型章解释说:
Collections.<TimeUnit>reverseOrder()
什么是这种仿制药的使用? 我发现它在一些代码,但从来没有读过任何事情。 在我看来,它允许给予一定的帮助,类型推断。 我试图寻找有关,但它不是那么容易找到(它在SCJP书/考试甚至不是!)
因此,有人可以给我它是如何工作的适当的解释,这是所有的usecases等?
谢谢
编辑感谢您的答案,但我预计更多的细节:)所以如果有人想添加一些额外的信息:
有关更复杂的情况下,像什么
- 使用类声明的类型,我可以这样做
Collections.<T>reverseOrder()
用于为例? - 使用
extends
, super
? - 使用
?
- 给编译器只部分帮助(即
O.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>()
它是一种通用的方法,明确的类型。 你总是可以做到这一点,但在大多数情况下,它是没有必要的。 然而,需要在某些情况下,如果编译器是无法自行推断出通用类型。
见朝着结束的例子教程页面 。
更新:只有第一的你的例子是有效的。 显式类型参数必须是,好了,明确的,所以没有通配符, extends
或super
被允许存在。 此外,你可以指定每一个明确的类型参数,或者都不; 即显式类型参数的数量必须的调用方法的类型参数的数量相匹配。 A型参数如T
如果在当前的范围明确定义是允许的,例如,作为封闭类的类型参数。
你是100%正确的,它是帮助类型推断。 大多数时候,你不需要做这在Java中,因为它可以推断出类型(甚至从一个任务,这是相当酷的左侧)。 这句法覆盖在泛型教程的Java网站上。
只需添加少量其他反应。
当获得根据编译器错误:
虽然“传统”铸造方法
(Comparator<TimeUnit>) Collections.reverseOrder()
看起来类似于泛型方法
Collections.<TimeUnit>reverseOrder()
铸造方法当然不是类型安全的(可能的运行时异常),而仿制药的方法是创建一个编译错误,如果有问题。 因此,该方法泛型是优选的,当然。
至于其他的答案已经澄清,这是帮助编译器弄清楚你想要什么泛型类型。 使用时,它通常需要Collections
的实用方法返回一个泛型类型的东西,不接收参数。
例如,考虑Collections.empty*
方法,它会返回一个空的集合。 如果你有一个期望有一个方法, Map<String, String>
:
public static void foo(Map<String, String> map) { }
你不能直接传递Collections.emptyMap()
它。 编译器会抱怨 ,如果它知道 ,它需要一个连Map<String, String>
:
// This won't compile.
foo(Collections.emptyMap());
你必须明确地声明您在通话想要的类型 ,我觉得看起来很丑陋:
foo(Collections.<String, String>emptyMap());
或者,你可以省略在方法调用类型声明,如果你指定emptyMap
返回值给一个变量将它传递给函数,我认为这是很可笑的面前,因为它似乎是不必要的,它表明编译器确实是不一致的:它有时做键入不带参数的泛型方法推断,但有时它不会:
Map<String, String> map = Collections.emptyMap();
foo(map);
这似乎不是一个很重要的事情,但是当泛型类型开始变得越来越复杂(如Map<String, List<SomeOtherGenericType<Blah>>>
)一种希望的是Java的将有更聪明的类型推断的开始(但是,因为它没有,一个可能会开始写它不是需要新的班,只是为了避免所有那些丑陋的<>
= d)。
在这种情况下,它是讲什么样的顺序应该在对象上的罚款,根据您指定什么类型的reverseOrder方法的一种方式。 比较需要得到有关如何订购的事情,具体的信息。
文章来源: What's this generics usage in Java? X.method()