有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型在Java中的用法是什么?X.<Y>方法()

我读了SCJP6的整本书《塞拉和贝茨》,考试得了88%的分数

但是,我从未听说过这种代码是如何工作的,因为在泛型一章中没有解释:

Collections.<TimeUnit>reverseOrder()

这种泛型用法是什么? 我在一些代码中发现了它,但从未读过任何关于它的内容。 在我看来,它允许对类型推断提供一些帮助。 我试着去搜索,但是不太容易找到(甚至在SCJP的书/考试中都没有!)

那么,有人能给我一个正确的解释,它是如何工作的,这些都是用例等

谢谢


编辑 谢谢你的回答,但我期待更多的细节:)因此,如果有人想添加一些额外的信息:

像这样更复杂的案件呢

  • 使用类中声明的类型,我可以执行类似Collections.<T>reverseOrder()的操作吗
  • 使用extendssuper
  • 使用?
  • 仅向编译器提供部分帮助(即O.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>()

共 (5) 个答案

  1. # 1 楼答案

    它是泛型方法的显式类型规范。你总是可以这样做,但在大多数情况下,这是不必要的。但是,在某些情况下,如果编译器无法自行推断泛型类型,则需要使用它

    参见the tutorial page末尾的示例

    更新:只有您的第一个示例有效。显式类型参数必须是显式的,因此这里不允许使用通配符extendssuper。此外,要么显式指定每个类型参数,要么不指定任何类型参数;i、 显式类型参数的数量必须与被调用方法的类型参数的数量相匹配。如果类型参数T在当前范围内定义良好,则允许使用它,例如作为封闭类的类型参数

  2. # 2 楼答案

    您是100%正确的,这有助于类型推断。大多数情况下,您不需要在Java中执行此操作,因为它可以推断类型(甚至可以从赋值的左侧推断,这非常酷)。Java网站上的generics tutorial 中介绍了这种语法

  3. # 3 楼答案

    只是对其他回答的一小部分补充

    获取相应的编译器错误时:

    而“传统”的铸造方法

    (Comparator<TimeUnit>) Collections.reverseOrder()
    

    看起来类似于泛型方法

    Collections.<TimeUnit>reverseOrder()
    

    强制转换方法当然不是类型安全的(可能是运行时异常),而泛型方法会在出现问题时创建编译错误。因此,泛型方法当然是首选方法

  4. # 4 楼答案

    在本例中,它是一种告诉reverseOrder方法应该根据指定的类型对对象施加何种排序的方法。比较器需要获得关于如何排序的特定信息

  5. # 5 楼答案

    正如其他答案所阐明的,这是为了帮助编译器找出您想要的泛型类型。当使用Collections实用程序方法返回泛型类型的内容而不接收参数时,通常需要它

    例如,考虑返回一个空集合的^ {< CD2>}方法。如果您有一个需要Map<String, String>的方法:

    public static void foo(Map<String, String> map) { }
    

    您不能直接将Collections.emptyMap()传递给它The compiler will complain即使它知道它期望一个Map<String, String>

    // This won't compile.
    foo(Collections.emptyMap());
    

    你必须明确地declare the type you want in the call,我认为这看起来很难看:

    foo(Collections.<String, String>emptyMap());
    

    或者,如果在将该类型声明传递给函数之前assign the ^{} return value to a variable,您可以在方法调用中省略该类型声明,我认为这非常可笑,因为它似乎不必要,并且表明编译器确实不一致:它有时对没有参数的泛型方法进行类型推断,但有时它不:

    Map<String, String> map = Collections.emptyMap();
    foo(map);
    

    这似乎不是一件很重要的事情,但当泛型类型开始变得越来越复杂(例如Map<String, List<SomeOtherGenericType<Blah>>>)时,一种人开始希望Java具有更智能的类型推断(但是,正如它所没有的那样,人们可能会开始编写不需要的新类,只是为了避免所有那些丑陋的<>=D)