Java中有自动类型推断吗?

问题描述 投票:0回答:6

Java 中是否有像 C++ 中那样的

auto
变量类型?

一个例子:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

我知道Java中有一个增强的for循环,但是有没有auto?如果没有,是否有办法做到这一点?我指的是 C++11 中的新功能。

java auto
6个回答
122
投票

通过

var
关键字,Java 10 可能有你(和我)想要的东西。

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

来自 JDK 增强提案 286


更新: 是的,该功能已进入 Java 10 版本!


71
投票

Java 10 引入了

var
标识符,类似于 C++
auto
;请参阅抱歉杰克逊小姐的回答

在 Java 10 之前,没有与

auto
关键字等效的关键字。可以实现相同的循环:

for ( Object var : object_array)
  System.out.println(var);

Java 具有局部变量,其作用域在定义它们的块内。 与C、C++类似,但没有auto或register关键字。但是,Java 编译器不允许使用未显式初始化的局部变量,并且会给出编译错误(与 C 和 C++ 不同,编译器通常只会给出警告)。 礼貌:Wikipedia

Java 中没有像 C++ 那样的主流类型推断。有一个RFE,但它被关闭为“不会修复”。给出的是:

人类通过两种方式从类型声明的冗余中受益。 首先,冗余类型可以作为有价值的文档——读者不需要 必须搜索 getMap() 的声明以找出它的类型 返回。其次,冗余允许程序员声明预期的 类型,从而受益于编译器执行的交叉检查。


28
投票

Java 7 引入了 diamond 语法

Box<Integer> integerBox = new Box<>(); // Java 7

与旧的java相比

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

挑剔的读者会注意到,这种新语法对在原始问题中编写 for 循环没有帮助。这似乎是正确的并且完全是故意的。请参阅引用 Oracle 错误数据库的其他答案。


20
投票

在 Java 8 中,您可以使用 lambda 类型推断来避免声明类型。与提问者的例子类似的是:

object_array.forEach(obj -> System.out.println(obj)); 
object_array.forEach(obj -> obj.do_something_that_only_this_particular_obj_can_do());

两者都可以使用方法参考来简化:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

8
投票

简而言之,不,没有auto类型。如果您所做的只是打印该值,则可以将该值称为

Object


8
投票

这不是一个纯粹的 Java 解决方案,但是添加一个名为 lombok 的库将使下面的魔法能够编译和工作,与 C++ 中的

auto
关键字非常相似

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
© www.soinside.com 2019 - 2024. All rights reserved.