使用Java中的字段继承Scala特征

时间:2016-07-06 07:02:46

标签: java scala inheritance interop traits

我有以下要继承的Scala特征:

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

1 个答案:

答案 0 :(得分:1)

可能会出现两个问题。

1)由于使用占位符类型(下划线),java不知道给fieldTypes的类型。这可能会导致生成的fieldTypes_ $ eq方法变为抽象(请参阅here以查看为var生成的java代码)

2)如果scala traits具有任何实现细节,则无法在Java中进行扩展。

1应该通过给它一个显式类型来修复,并且可以通过将特性包装在类中以在Java中扩展来修复2。 (虽然2似乎不是你的问题,只是要注意的事情)