Java中有自动类型推断吗?

Gam*_*iac 96 c++ java auto

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();
Run Code Online (Sandbox Code Playgroud)

我知道Java中有一个增强的for循环,但是有自动吗?如果没有,是否有这样做的黑客?我指的是C++ 11中的新功能

sor*_*son 53

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

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>
Run Code Online (Sandbox Code Playgroud)

来自JDK Enhancement Proposals 286


更新: Yap,该功能使其成为Java 10版本!

  • 次要挑选:`var`不是关键字!来自[JLS](https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.9):"var不是关键字,而是具有特殊标识符的标识符意思是局部变量声明的类型".因此,与关键字不同,没有什么可以阻止你调用变量或方法"var". (6认同)
  • 是的,它是一个改进,但是该关键字只能与局部变量一起使用。不像C ++自动类型推断那么强大 (5认同)
  • 好点@KlitosKyriacou。但是,如果我想将“关键字”替换为“标识符”,或者甚至将“具有特殊含义的标识符用作局部变量声明的类型”,我想答案就不太清楚了。但是,是的,`var`确实不在关键字列表中。 (2认同)

NIN*_*OOP 38

在问题被编辑之前回答:

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

for ( Object var : object_array)
  System.out.println(var);
Run Code Online (Sandbox Code Playgroud)

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

不,像C++这样的Java中没有任何主流的类型推断.有一个RFE,但这被关闭为"无法修复",给出的理由是:

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

  • "人类从冗余中受益." 这是真的.每天早上我醒来时都会想"如何让我的代码更加冗余?".因为好处. (121认同)
  • 这个问题是关于C++ 11中的类型推断,而不是关于C和pre-C++ 11中`auto`的旧用法.您的编辑不在主题上. (10认同)
  • @GamesBrainiac不,Java中的方法调用总是多态的.但是,许多其他的东西(例如重载解析,或者没有在`Object`上定义的任何操作)都不能这样做.这不是一个好的答案,它只会发生作用,因为问题中的例子很弱. (9认同)
  • "这不是我的意思,一旦你输入一个对象,它会给你Object的to_string"False.绝对100%错误. (4认同)
  • 不实现如此方便的功能的最可笑的原因是,现在我明白为什么我的非开发人员朋友称我为打字员了。 (3认同)
  • 此外,此答案已过时,因为自 Java 9 以来 `var` 是保留关键字。 (2认同)

Tar*_*sch 24

Java 7引入了菱形语法

Box<Integer> integerBox = new Box<>(); // Java 7
Run Code Online (Sandbox Code Playgroud)

与旧的java相比

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,但他(和我)正在寻找的东西是:`auto integerBox = new Box <Integer>();`,这通常用于从函数中获取返回值,有时可以像`HashMap那样复杂化<String,LinkedList <Operation,Set <Integer >>>` (3认同)

Aji*_*rge 17

在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());
Run Code Online (Sandbox Code Playgroud)

这两个也可以使用方法引用简化:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);
Run Code Online (Sandbox Code Playgroud)


Sim*_*onC 8

总之,不,没有自动型.如果您所做的只是打印值,您可以将值作为一个引用Object.


sam*_*024 8

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

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