什么是Java中的泛型这种用法? X。 方法()(What's this gener

2019-07-29 19:23发布

我读过整SCJP6书Sierra和贝茨书,取得了88%的考试。

但是,我从来没有听说过这样的代码是如何工作的,因为它不是在泛型章解释说:

Collections.<TimeUnit>reverseOrder()

什么是这种仿制药的使用? 我发现它在一些代码,但从来没有读过任何事情。 在我看来,它允许给予一定的帮助,类型推断。 我试图寻找有关,但它不是那么容易找到(它在SCJP书/考试甚至不是!)

因此,有人可以给我它是如何工作的适当的解释,这是所有的usecases等?

谢谢


编辑感谢您的答案,但我预计更多的细节:)所以如果有人想添加一些额外的信息:

有关更复杂的情况下,像什么

  • 使用类声明的类型,我可以这样做Collections.<T>reverseOrder()用于为例?
  • 使用extendssuper
  • 使用?
  • 给编译器只部分帮助(即O.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>()

Answer 1:

它是一种通用的方法,明确的类型。 你总是可以做到这一点,但在大多数情况下,它是没有必要的。 然而,需要在某些情况下,如果编译器是无法自行推断出通用类型。

见朝着结束的例子教程页面 。

更新:只有第一的你的例子是有效的。 显式类型参数必须是,好了,明确的,所以没有通配符, extendssuper被允许存在。 此外,你可以指定每一个明确的类型参数,或者都不; 即显式类型参数的数量必须的调用方法的类型参数的数量相匹配。 A型参数如T如果在当前的范围明确定义是允许的,例如,作为封闭类的类型参数。



Answer 2:

你是100%正确的,它是帮助类型推断。 大多数时候,你不需要做这在Java中,因为它可以推断出类型(甚至从一个任务,这是相当酷的左侧)。 这句法覆盖在泛型教程的Java网站上。



Answer 3:

只需添加少量其他反应。

当获得根据编译器错误:

虽然“传统”铸造方法

(Comparator<TimeUnit>) Collections.reverseOrder()

看起来类似于泛型方法

Collections.<TimeUnit>reverseOrder()

铸造方法当然不是类型安全的(可能的运行时异常),而仿制药的方法是创建一个编译错误,如果有问题。 因此,该方法泛型是优选的,当然。



Answer 4:

至于其他的答案已经澄清,这是帮助编译器弄清楚你想要什么泛型类型。 使用时,它通常需要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)。



Answer 5:

在这种情况下,它是讲什么样的顺序应该在对象上的罚款,根据您指定什么类型的reverseOrder方法的一种方式。 比较需要得到有关如何订购的事情,具体的信息。



文章来源: What's this generics usage in Java? X.method()