例如,假設我有在Scala中,我怎麼混入Java接口到Scala代碼
interface ICar {...}
class Car implements ICar {...}
在斯卡拉我希望做
new MyScalaClass with ICar
但使用ICAR即汽車的Java實現。這樣做的語法是什麼?
例如,假設我有在Scala中,我怎麼混入Java接口到Scala代碼
interface ICar {...}
class Car implements ICar {...}
在斯卡拉我希望做
new MyScalaClass with ICar
但使用ICAR即汽車的Java實現。這樣做的語法是什麼?
您可以使用對象聚合,但將聚合封裝在特徵中。假設你有下面的Java代碼:
interface ICar {
public void brake();
}
public class Car implements ICar {
public void brake() { System.out.println("BRAKE !!!"); }
}
然後你就可以定義以下斯卡拉特點:
trait HasCar { self: ICar =>
private val car = new Car
def brake() = car.brake()
}
最後,你可以混合你需要到你的課堂上的一切:
val c = new MyScalaClass extends ICar with HasCar
c.brake // prints "BRAKE !!!"
new MyScalaClass with ICar
是這樣做的語法,但如果在ICar
方法未在MyScalaClass
實施,MyScalaClass with ICar
是一個抽象類,不能建造。因此,您需要爲ICar
中的方法提供方法體。
// ICar.java
interface ICar{
void drive();
}
//MyScalaClass.scala
class MyScalaClass{
def brake =()
}
//UseIt.Scala
// error: object creation impossible, since method
// drive in trait ICar of type => Unit is not defined
val foo = new MyScalaClass with ICar
// this works
val foo = new MyScalaClass with ICar { def drive = println("Driving") }
您不能使用with
混合兩個類。只允許一個類別,加上任意數量的特徵或接口。因此:
class MyScalaClass
class Car
new MyScalaClass with Car
// error: class Car needs to be a trait to be mixed in
@基普頓:當你談論「新」表達時,你剛剛說的是錯誤的。 –
@Ken:你說得對,我正在考慮定義一個新班級。 –
我一定錯過了一些東西,你爲什麼不把MyScalaClass聲明爲擴展Car? –