使用 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 似乎不是你的问题,只是需要注意的事情)
我想继承以下 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 似乎不是你的问题,只是需要注意的事情)