Java 10'var'将在没有完全重建的情况下生成错误

aKi*_*leR -5 java rebuild var java-10

请参考以下示例.

====之前====

---- A.java ---

var userAccounts = userService.getUserAccounts();
Run Code Online (Sandbox Code Playgroud)

--- B.java

class UserService {
public OldUserAccounts getUserAccounts();
}
Run Code Online (Sandbox Code Playgroud)

==== ====之后

---- A.java ---

var userAccounts = userService.getUserAccounts();
Run Code Online (Sandbox Code Playgroud)

--- B.java

class UserService {
public NewUserAccounts getUserAccounts();
}
Run Code Online (Sandbox Code Playgroud)

尽管A.java发生了变化,但B.java源文件没有变化.B.class文件的信息有'userAccounts'变量类型是'OldUserAccounts'不是吗?如果我将修改后的源文件应用于真实服务器.'var'会产生一个bug吗?

注意: 我知道这是一个不好的做法,即使没有var更改也可能是字节码不兼容的.在我的案例中,重建整个项目的想法并不好.成本太高了

任何想法或解决方法??

T.J*_*der 8

尽管A.java发生了变化,但B.java源文件没有变化.

你的意思是A.java即使改变了也没有B.java变化.

是的,如果你改变了B.java,你必须重新编译A.java,这取决于它.var在这方面没有任何改变,无论如何你需要这样做.唯一的区别是,A.java如果您使用var,源代码不会改变,如果您不使用,则会改变.无论如何都需要重新编译.

大多数程序员只会将修改后的源文件应用于真实服务器.

引文需要.

非玩具项目的大多数程序员使用适当的构建工具.使用适当的构建工具将确保您根据需要重新编译和重新部署.如果你正在挑选和重新部署你重新编译和重新部署的内容,而不是总是在它们的依赖项发生变化时重新编译类,那么从Java 10开始你就会遇到问题 - 你已经在Java 9及更早版本中遇到了问题.您进行不兼容的更改B.java,无法识别您需要修改和重建A.java,并且遇到运行时不兼容问题.

var不是您描述的场景中的问题.项目工具是.

var完全是可选的.如果您认为它会给您的项目带来麻烦,请不要使用它.

  • 有趣的事实:局部变量的类型大多与执行无关,因此无论是否使用`var`确实无关紧要.它已经是指向`UserService`中的'OldUserAccounts getUserAccounts()`的调用指令,当返回类型改变时它会中断. (2认同)