我们可以在Scala中进行条件导入吗?

时间:2014-11-04 15:27:54

标签: scala

说我有以下代码:

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的代码。还有什么是将来设计此类代码的最佳方式,以便这样的扩展很容易?

2 个答案:

答案 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