看起来scala将伴随对象中的方法编译为静态方法,这使得从java代码调用它们更容易一些.例如,您可以编写CompanionObject.method()而不是CompanionObject $ .MODULE $ .method().但是,有时看似无关的代码更改会破坏这种行为.我想出了这个例子来说明问题
$ cat TestCompanion.scala
class TestCompanion
object TestCompanion {
def init2 {}
}
@SerialVersionUID(1L)
class TestCompanion2
object TestCompanion2 {
def init2 {}
}
$ scalac -version
Scala compiler version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac TestCompanion.scala
$ javap TestCompanion
Compiled from "TestCompanion.scala"
public class TestCompanion extends java.lang.Object implements scala.ScalaObject{
public static final void init2();
public TestCompanion();
}
$ javap TestCompanion2
Compiled from "TestCompanion.scala"
public class TestCompanion2 extends java.lang.Object implements scala.ScalaObject{
public static final long serialVersionUID; …Run Code Online (Sandbox Code Playgroud) 以下代码段
class A {
def foo = "A.foo"
}
trait B {
def foo = "B.foo"
def bar = "B.bar"
}
val x = new A with B
Run Code Online (Sandbox Code Playgroud)
不编译,因为
error: overriding method foo in class A of type => java.lang.String;
method foo in trait B of type => java.lang.String needs `override' modifier
Run Code Online (Sandbox Code Playgroud)
但是,我的意图是定义x,以便:
x.foo => "A.foo"
x.bar => "B.par"
Run Code Online (Sandbox Code Playgroud)
也就是说,我只希望x从B继承bar,但不是foo.scala有没有办法实现这一目标?