从JEP 286中,我们可以var
在JDK
10(18.3)中使用局部类型推断()。JEP指出,可以进行以下编译:
var list = new ArrayList<String>(); // infers ArrayList<String>
我很想知道如果尝试以下操作会发生什么:
var list = new ArrayList<>();
我在第二个片段中提出的内容是否可以编译?如果是这样(我对此表示怀疑),将ArrayList
accept Object
作为其通用类型吗?
我会自己尝试,但是我无法使用可以安装早期发行版的任何计算机。
谢谢!
是的,var
钻石操作员可以组合在一起。编译器将推断最特定的泛型类型:
var list = new ArrayList<>(); // Infers ArrayList<Object>
var list = new ArrayList<>(List.of(1, 2, 3)); // Infers ArrayList<Integer>
您甚至可以将它们与匿名类结合使用:
var list = new ArrayList<>() {};
从JEP 286中,我们可以在JDK 10(18.3)中利用本地类型推断()。JEP声明将进行以下编译,这是预期的: 谢谢!
我试图扫描JEP-286关于局部类型推断的信息。我看到这只适用于局部变量-理解。因此,这确实有效: 另一方面,我确实看到这并不能编译: 很明显,事实并非如此,因为JEP是这么说的。现在我的问题是: 声明为的公共/受保护成员失败是完全合理的,至少IMO是如此。但是,为什么即使它是,它也不能编译呢?我只能假设您仍然可以通过反射来获取该变量(我无法获取这样的局部字段)……而获取该变量需要进行转换,很可能
谁能总结一下在哪些情况下我将无法使用var?
问题内容: 我尝试扫描有关本地类型推断的JEP-286。我看到这仅适用于局部变量- 了解。因此这确实有效: 我确实看到,另一方面,它无法编译: 很明显,事实并非如此,因为JEP是这样说的。现在我的问题是: 对于宣布失败的 公共/受保护 成员,至少是IMO,这是完全合理的。但是,为什么即使编译也不编译呢?我只能假设您仍然可以通过反射保留该变量(而我无法获得这样的局部字段)…而且获取该变量可能需要强制
当然,如果我给IntelliJ添加更多上下文,比如: 这是正确的,但在Java10 var推断类型上下文中,这是错误的: 我理解编译器不能推断的输入类型。如果我写: 编译器的错误更加不可读(但包含更多关于推理失败原因的提示),如下所示:
主要内容:Java10 局部变量类型推断,声明局部变量的旧用法,声明局部变量的新用法,需要注意的事项,Java10 局部变量类型推断的示例Java10 局部变量类型推断 局部变量类型推断是 Java 10 以后可用语言最明显的变化之一。它允许使用 var 定义变量而不指定它的类型。编译器使用提供的值推断变量的类型。这种类型推断仅限于局部变量。 声明局部变量的旧用法 声明局部变量的新用法 需要注意的事项 在成员变量、方法参数、返回值的情况下没有类型推断。 局部变量应在声明时初始化,否则编译器将无法