Geo*_*rge 1 types jvm casting scala return-type-deduction
我觉得我应该在这个事实上加上我用sbt构建项目的事实.
我的问题是,如果在编译时一个方法返回一个无类型的东西,在我调用该方法的文件中,只要我使用类型推断,一切都会编译.一旦我尝试将未导入的类型分配给我使用函数的返回值创建的var/val,我就会遇到编译器错误.
假设我在两个包中有两个类.类App在包main和类Imported中包libraries.让我们进一步说,我们ImportedFactory在包main中有一个类,并且该类有一个方法来创建Imported类型的对象.
这段代码编译得很好:
class App() {
// method return object of type Imported
val imp = ImportedFactory.createImportedObject()
}
Run Code Online (Sandbox Code Playgroud)
这不是:
class App() {
// method return object of type Imported
val imp : Imported = ImportedFactory.createImportedObject()
}
Run Code Online (Sandbox Code Playgroud)
这又一次:
import libraries.Imported
class App() {
// method return object of type Imported
val imp : Imported = ImportedFactory.createImportedObject()
}
Run Code Online (Sandbox Code Playgroud)
这似乎是相当奇怪的行为.对于编译时带类型推断的语言来说这是正常的吗?由于我的无知,我还没有注意到go/C++中的语言?
两种有效方法中的一种(导入和显式类型与感染)有哪些优势/缺点?(当然,期望一个更明确,更冗长,另一个更短)
这是黑魔法还是Scala编译器以相当直接的方式完成这些推论?
导入的唯一功能是在当前范围内提供不完全限定的名称.你也可以这样写:
class App() {
val imp: libraries.Imported = ImportedFactory.createImportedObject()
}
Run Code Online (Sandbox Code Playgroud)
您import libraries.Imported可以使用较短的名称Imported进行编写.如果让编译器推断出类型,则不要在代码中提及类型,因此不必导入其较短的名称.
顺便说一下:这与C++中的动态转换无关.代码中唯一可行的机制是类型推断.