【问题标题】:New type casting in Java 8 or I'm making a mistake?Java 8 中的新类型转换还是我犯了一个错误?
【发布时间】:2014-04-17 14:23:35
【问题描述】:

我在一些与 JavaFX 相关的代码中看到了一种新的类型转换形式。奇怪的是它的功能类似于类型转换,但我找不到它under the categories of casting in Java 8 Specifications。这是一个例子:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("tabs/tabbedWin.fxml"));
    TabbedWinController twc1 = loader.<TabbedWinController>getController();
    TabbedWinController twc2 = (TabbedWinController) loader.getController();

最后两行似乎做同样的工作,但我想知道twc1 前面的语法是什么意思?这对我来说是全新的。

如果是类型转换,为什么我不能使用像 int i = &lt;Integer&gt; f; 这样的语句,其中 f 是一个浮点变量?

所以我很想知道它是什么?从什么时候开始将它添加到 Java 中?我应该/可以/不应该在哪里使用它?

【问题讨论】:

    标签: java casting type-conversion


    【解决方案1】:

    这是为static 方法指定泛型类型的方式。自 Java 5 中发布泛型以来,它就已可用。

    List<String> emptyListOfStrings = Collections.<String> emptyList();
    

    在您的情况下,两种形式都可以正常工作,因为 getController 方法返回指定泛型类型的对象。

    请参阅here 进行讨论。

    【讨论】:

      【解决方案2】:

      它与 JavaFX 无关,这种形式的方法称为 泛型方法,与强制转换无关。

      所以当你写的时候

      loader.<TabbedWinController>getController();
      

      这意味着您希望getController() 返回一个TabbedWinController 类型的对象。

      【讨论】:

      • 那么,为什么 在没有它的情况下插入它也可以工作,没有任何语法错误或警告?
      • 如果你在没有泛型类型的情况下调用getController(),这个方法将简单地返回一个Object。如果您将其转换为 TabbedWinController 就像在第二种情况下一样,则返回的 Object 将是您想要的。 编辑: 我研究了那个方法,它所做的只是return (T)controller;。所以实际上,当您使用泛型类型调用它时,该方法会为您转换控制器。所以结果和你把控制器作为一个Object并自己进行转换时的结果是一样的。
      • 非常感谢!无论如何,我选择了另一个答案作为最佳答案,因为它引用了解释了它为什么工作并且没有该符号的教程页面。 docs.oracle.com/javase/tutorial/java/generics/methods.html -- 上面写着“一般来说,这可以省略,编译器会推断出需要的类型”
      猜你喜欢
      • 2014-11-14
      • 2022-10-13
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多