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

Inherit Scala trait with fields in Java

我想继承以下 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) java 由于使用了占位符类型(下划线),不知道给fieldTypes赋予什么类型。这可能会导致生成的 fieldTypes_$eq 方法被抽象化(请参阅 here 以了解为 var 生成了哪些 java 代码)

2) 如果 scala traits 有任何实现细节,则不能在 Java 中扩展。

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