Scala,为什么我不需要导入推断类型

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编译器以相当直接的方式完成这些推论?

Jas*_*r-M 5

导入的唯一功能是在当前范围内提供不完全限定的名称.你也可以这样写:

class App() {
    val imp: libraries.Imported = ImportedFactory.createImportedObject() 
}
Run Code Online (Sandbox Code Playgroud)

import libraries.Imported可以使用较短的名称Imported进行编写.如果让编译器推断出类型,则不要在代码中提及类型,因此不必导入其较短的名称.

顺便说一下:这与C++中的动态转换无关.代码中唯一可行的机制是类型推断.