Java中有自动types推断吗?

Java中有像C ++中那样的autovariablestypes吗?

一个例子:

 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中有一个增强的循环,但有一个汽车? 如果没有,是否有这样做的黑客? 我指的是C ++ 11中的新function

在问题被解答之前回答:

没有在Java中没有autovariablestypes。 同样的循环可以实现为:

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

Java有局部variables,其范围在已定义的块内。 与C和C ++类似,但没有自动或注册关键字。 但是,Java编译器将不允许使用未经显式初始化的本地variables,并且会给出编译错误(不同于C和C ++,编译器通常只会给出警告)。 礼貌: 维基百科 。

不,在C ++等Java中没有任何主stream的类推。 有一个RFE,但这是封闭的“不会修复”,原因是:

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

Java 7引入了菱形语法

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

和老java相比

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

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

在Java 8中,您可以使用lambdatypes推断来避免声明types。 提问者的例子的模拟将是:

 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); 

总之,不,没有汽车types。 如果你所做的只是打印值,那么你可以把这个值作为一个Object来引用。

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

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

可能是Java 10有你(我)想要的,通过var关键字。

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

来自JDK增强build议286