Java中有自动类型推断吗?

时间:2013-04-21 15:23:16

标签: java c++ auto

Java中是否存在auto变量类型,就像在C ++中一样?

一个例子:

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循环,但是有自动吗?如果没有,是否有这样做的黑客?我指的是C ++ 11中的新功能

6 个答案:

答案 0 :(得分:37)

通过var关键字,Java 10可以满足您(和我)的需求。

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

来自JDK Enhancement Proposals 286

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

答案 1 :(得分:35)

在问题之前回答已编辑

Java中没有auto变量类型。可以实现相同的循环:

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

Java具有局部变量,其范围位于已定义的块内。 与C和C ++类似,但没有auto或register关键字。但是,Java编译器不允许使用非显式初始化的局部变量,并且会产生编译错误(与C和C ++不同,编译器通常只会发出警告)。礼貌:{{3 }}

不,像C ++这样的Java中没有任何主流类型推断。有一个Wikipedia,但这被关闭为“无法解决”,理由是:

  

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

答案 2 :(得分:24)

Java 7引入了diamond syntax

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

与旧java相比

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

关键读者会注意到这个新语法无助于在原始问题中编写for循环。这似乎是正确和完全有意的。请参阅引用Oracle错误数据库的其他答案。

答案 3 :(得分:16)

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

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.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);

答案 4 :(得分:8)

简而言之,不,没有自动类型。如果你正在做的只是打印值,你可以将值称为Object

答案 5 :(得分:3)

它不是一个纯Java解决方案,但是添加一个名为lombok的库将使下面的魔法能够在C ++中编译和工作非常类似于auto关键字

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}