2016-07-06 71 views
0
領域

我有以下Scala的特點,我想繼承:繼承Scala特性,在Java

trait StreamTableSink[T] extends TableSink[T] { 

    /** Emits the DataStream. */ 
    def emitDataStream(dataStream: DataStream[T]): Unit 
} 

延伸:

trait TableSink[T] { 

    private var fieldNames: Option[Array[String]] = None 
    private var fieldTypes: Option[Array[TypeInformation[_]]] = None 
    ... 
} 

但是,當我繼承它在Java中是這樣的:

public abstract class KafkaTableSink implements StreamTableSink<Row> { 
    ... 
} 

我收到以下錯誤:

Error:(29, 8) java: kafka.KafkaAvroTableSink09 is not abstract and does not override abstract method TableSink$$fieldTypes_$eq(scala.Option<typeinfo.TypeInformation<?>[]>) in sinks.TableSink

其中KafkaAvroTableSink09繼承可能會產生KafkaTableSink

+0

你可以只使'fieldNames'和'fieldTypes' vals'而不是'vars'。 – marstran

+0

這個問題是關於'def's而不是'var's,但問題和解決方案是一樣的。 –

+0

@AlexeyRomanov我不認爲這是你提到的問題的重複。我對「def」沒有任何問題,我成功實現了抽象方法。我有一個與fieldTypes_ $ eq方法有關的問題,它似乎與「fieldTypes」var有關。 –

回答

1

兩個問題。

1)由於使用佔位符類型(下劃線),java不知道給fieldTypes的類型。這可能會導致生成的fieldTypes_ $ eq方法被抽象化(請參閱here以查看生成的var代碼是什麼)

2)如果scala特徵具有任何實現細節,則無法在Java中進行擴展。

1應該通過給它一個明確的類型來修復,2可以通過將這個特徵包裝到一個類中來擴展到Java來修復。 (雖然2似乎不是你的問題,只是要注意的事情)

+0

不,問題是2.Scala中的'_'被正確地轉換成Java的'''通配符,你可以在錯誤信息中看到它。 –