Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

scala/import

import

オブジェクトのインポート

オブジェクトをインポートすることで、そのオブジェクトを指定しなくともメンバにアクセスできるようになる

class Foo {
  val field = 123
}
object Main {  
  def main(args: Array[String]) {
    val foo = new Foo
    import foo._
    println(field)
  }
}

結果は

123

たとえprivateでもコンパイラに見えてしまうことに注意

これはおそらくコンパイラのバグ。少なくとも意図しているわけでは無いと思われる。

class Foo {
  val field = 123
}
class Bar {
  private val field = 456
}
object Main {  
  def main(args: Array[String]) {
    val foo = new Foo
    val bar = new Bar
    import foo._
    import bar._
    println(field) // reference to field is ambiguousというエラー
  }
}

Barのfieldはprivateであるにも関わらず、fieldという名前をFooのものかBarのものか決められないということ。 このエラーが出るので、例えば以下のようなことができない。

trait Logger {
  protected def info(s: String) { }
}

class Foo extends Logger { 
}
class Bar extends Logger {
  def something() {
    val foo = new Foo
    
    import foo._
    info("something happen")
  }
}

結局はなんでもかんでもtraitにしない方が無難ということ。以下のようにした方がよい。

class Logger {
  protected def info(s: String) { }
}

class Foo { 
  private val logger = new Logger
}
class Bar extends Logger {
  private val logger = new Logger
  def something() {
    val foo = new Foo
    
    import foo._
    info("something happen")
  }
}