2011-08-25 53 views
3

例如,假設我有在Scala中,我怎麼混入Java接口到Scala代碼

interface ICar {...} 
class Car implements ICar {...} 

在斯卡拉我希望做

new MyScalaClass with ICar 

但使用ICAR即汽車的Java實現。這樣做的語法是什麼?

+0

@基普頓:當你談論「新」表達時,你剛剛說的是錯誤的。 –

+0

@Ken:你說得對,我正在考慮定義一個新班級。 –

+2

我一定錯過了一些東西,你爲什麼不把MyScalaClass聲明爲擴展Car? –

回答

4

您可以使用對象聚合,但將聚合封裝在特徵中。假設你有下面的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 !!!" 
2

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") } 
2

您不能使用with混合兩個類。只允許一個類別,加上任意數量的特徵或接口。因此:

class MyScalaClass 
class Car 
new MyScalaClass with Car 
// error: class Car needs to be a trait to be mixed in