【问题标题】:Inherit Scala trait with fields in Java [duplicate]使用 Java 中的字段继承 Scala 特征 [重复]
【发布时间】:2016-07-06 07:02:46
【问题描述】:

我想继承以下 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

【问题讨论】:

  • 你可以只使用 fieldNamesfieldTypes vals' 而不是 vars'。
  • 那个问题说的是defs,不是vars,但是问题和解决方法是一样的。
  • @AlexeyRomanov 我不认为这是你提到的问题的重复。我对“def”没有任何问题,并且我成功地实现了抽象方法。我对 fieldTypes_$eq 方法有疑问,它似乎与我的“fieldTypes”变量有关。
  • vars 创建两个非抽象方法,因此您具有非抽象方法的特征,与链接问题中的完全相同。非抽象的vals 也会发生同样的情况。
  • @AlexeyRomanov 这是否意味着不可能用“var”s继承特征?

标签: java scala inheritance interop traits


【解决方案1】:

可能会出现两个问题。

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

2) 如果 Scala 特征有任何实现细节,则不能在 Java 中扩展它们。

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

【讨论】:

  • 不,问题是2。Scala中的_被正确翻译成Java的?通配符,你可以在错误信息中看到。
猜你喜欢
  • 2020-11-11
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多