【问题标题】:Has the downcast syntax changed to pointy brackets?向下转换语法是否已更改为尖括号?
【发布时间】:2021-07-15 00:37:56
【问题描述】:

向下转换过去看起来像这样:

((TextView)rootView.findViewById(R.id.fooText)).setText("Foo");

今天我注意到 Android Studio 使用了不同的语法:

rootView.<TextView>findViewById(R.id.fooText).setText("Foo");

这是替代旧语法的新语法吗?它有名字吗?它有什么优势?

【问题讨论】:

  • 第二种语法不是强制转换。它在方法调用中使用通用参数。见stackoverflow.com/questions/3012781/…
  • 第二种方法的优点与泛型与一般的强制转换几乎相同:您将进行编译时检查,告诉您您使用的泛型类型是否适用于该方法或如果该方法完全支持泛型。通过强制转换,您只会在运行时知道它是按预期工作还是可能导致异常

标签: java


【解决方案1】:

这不是演员表。 Java 的强制转换语法一直是,并且一直是,在值之前加上一个带括号的类型。 findViewById有签名

public <T> T findViewById (int id)

即您可以将返回类型T 指定为findViewById 的泛型类型的一部分。真的,所有这一切都迫使findViewbyId 为您执行传统的(T) 演员表(这同样不安全,并且在内部仍然令人沮丧)。在标准 Java 中,与显式转换相比,确实没有理由这样做。然而,

注意:在大多数情况下——取决于编译器支持——生成的视图会自动转换为目标类类型。如果目标类类型不受约束,则可能需要显式转换。

所以听起来有些 IDE,可能是 Android Studio,有特殊的推理规则,可以在某些情况下推断(或验证)T 的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多