141

autoJava 中是否有像 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 中的新特性

4

6 回答 6

95

var可能是 Java 10 通过关键字拥有您(和我)想要的东西。

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

来自JDK 增强提案 286


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

于 2017-10-31T14:15:23.783 回答
65

Java 10 引入了一个var类似于 C++ 的标识符auto;看到sorrymissjackson的回答

在 Java 10 之前,没有等效于auto关键字。相同的循环可以实现为:

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

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

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

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

于 2013-04-21T15:28:23.373 回答
26

Java 7 引入了菱形语法

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

与旧 java 相比

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

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

于 2013-07-31T22:48:36.107 回答
18

在 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);
于 2016-05-09T16:37:34.163 回答
8

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

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
于 2017-10-22T21:22:35.833 回答
7

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

于 2013-04-21T15:25:07.100 回答