Java 中有自动类型推断吗?

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

119651 次浏览

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

Java10引入了一个类似于 C + + autovar标识符; 参见 对不起 Jackson 小姐的回答

在 Java10之前,没有与 auto关键字等价的东西:

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

Java 有局部变量,它们的作用域在定义它们的代码块中。

Java 中没有像 C + + 那样的主流类型推断。有一个 RFE,但这是关闭的,因为“将不修复”。答案是:

人类从两个方面受益于类型声明的冗余。 首先,冗余类型可以作为有价值的文档,而阅读器不能 必须搜索 getMap ()的声明才能找到它的类型 其次,冗余允许程序员声明预期的 类型,从而受益于编译器执行的交叉检查。

Java7引入了 菱形句法

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

比起以前的爪哇咖啡

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

批判性的读者会注意到,这种新语法无助于在原问题中编写 for 循环。看起来完全正确,而且是故意的。参见引用 Oracle bug 数据库的另一个答案。

在 Java8中,可以使用 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);

这不是一个纯 Java 解决方案,但是添加一个称为 龙目怪的库将使下面的魔术能够编译和工作非常类似于 C + + 中的 auto关键字

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

通过 var关键字,Java10可能具有您(和我)想要的东西。

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

来自 JDK 增强建议286


更新: Yap,这个特性已经进入 Java10版本!