【问题标题】:Scala - Overriding a Java interface method in a Scala classScala - 覆盖 Scala 类中的 Java 接口方法
【发布时间】:2015-10-31 18:18:05
【问题描述】:

我有一个 Java 接口 Writer 定义如下:

public interface Writer<K, V> {

    Iterator<Product2<K, V>> iterator ();
}

我正在尝试在 Scala 类 ExternalWriter 中实现此接口,如下所示:

private class ExternalWriter[K, V, C]
  extends Logging
  with Writer[K, V] {

    override def iterator(): Iterator[Product2[K, C]] = {
        partitionedIterator.flatMap(pair => pair._2)
  }
}

但是当我尝试编译这段代码时,我得到一个错误:

错误:在特征 SortShuffleFileWriter 中覆盖方法迭代器 类型 ()Iterator[Product2[K,V]];方法迭代器具有不兼容的类型 覆盖 def iterator(): Iterator[Product2[K, C]] = {

我该如何解决这个问题?

【问题讨论】:

  • java.util.Iterator 接口与scala.collection.Iterator 特征是分开的(除了@Codebender 提到的问题)。你有没有考虑到这一点?

标签: java scala


【解决方案1】:

您为什么将V 更改为C

你的覆盖方法应该是,

override def iterator(): Iterator[Product2[K, V]] = {
    partitionedIterator.flatMap(pair => pair._2)

如果你想使用C,那么你应该实现WriterC一样,

with Writer[K, C] {

【讨论】:

  • 当我将覆盖方法更改为覆盖 def iterator(): Iterator[Product2[K, V]] 我收到以下错误错误:类型不匹配;找到:Iterator[Product2[K,C]] 需要:scala.collection.GenTraversableOnce[Product2[K,V]] partitionedIterator.flatMap(pair => pair._2) ^
  • @HaseebJaved,你有没有像我提到的那样尝试改变你的with
  • 是的,但这会导致各种其他错误,例如: Error:(90, 22) class ExternalWriter 需要是抽象的,因为方法 insertAll 在 trait Writer of type (x$1: Iterator[Product2[ K,C]])Unit未定义(注意Iterator[Product2[K,C]]不匹配Iterator[Product2[K,V]]:它们的类型参数不同) private[spark] class ExternalWriter[K, V , C]( 我想我的程序结构都错了,可能我应该重新开始。
【解决方案2】:

尝试用 java.util.Iterator 替换 scala 类中的 Iterator,因为 scala Iterator 和 java Iterator 是不同的。

private class ExternalWriter[K, V, C]
  extends Logging
  with Writer[K, V] {

    override def iterator(): java.util.Iterator[Product2[K, C]] = {
        partitionedIterator.flatMap(pair => pair._2)
  }
}

以上将是修改后的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多