说我有以下代码:
package my
class Foo
class Bar extends Foo
object Chooser {
val isFoo = true
}
我将Foo
导入为:
import my.{Foo => MyClass}
我希望能够做到这样的事情:
如果Chooser.isFoo
,则:
import my.{Foo => MyClass}
否则:
import my.{Bar => MyClass}
我在代码中使用了Foo
,如下所示:
object MyObj {
val a = new MyClass
// ...
}
Scala的隐藏功能是否允许我使用Bar
代替Foo
而不修改MyObj
的代码。还有什么是将来设计此类代码的最佳方式,以便这样的扩展很容易?
答案 0 :(得分:2)
没有,但我猜你对运行时的不同实现比对条件类型导入更感兴趣。您的Chooser.isFoo
听起来像是在运行时而不是类型系统中发生的事情。
如何做到这一点的一个例子,因为Foo和Bar的常见类型是Foo:
val a: Foo =
if (Chooser.isFoo) new my.Foo
else new my.Bar
根据您的编辑进行编辑:您可以通过使用抽象类型或类型参数来延迟选择,如下所示:
class MyObj[T :> Foo] {
val a: T
}
val anInstance = new MyObj[Foo]
val anotherInstance = new MyObj[Bar]
注意T类必须是Foo的子类的类型绑定,否则你不会知道你可以用T做什么。
答案 1 :(得分:1)
碰巧看到这个旧帖子,有点好奇为什么它不能在Scala中进行条件导入?可能是旧版本限制,不确定吗?但是请参阅this,我们可以在任何Scala代码位置导入。
对于您的情况,可能是:
try.scala:
package my
class Foo {
}
class Bar extends Foo
object Chooser {
val isFoo = true
}
object MyObj extends App {
if (Chooser.isFoo) {
import my.{Foo => MyClass}
val a = new MyClass
println(a)
} else {
import my.{Bar => MyClass}
val a = new MyClass
println(a)
}
}
运行输出:
C:\abc\abc>scalac try.scala
C:\abc\abc>scala my.MyObj
my.Foo@6f4a47c7