2016-07-06 43 views
0
领域

我有以下Scala的特点,我想继承:继承Scala特性,在Java

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

+0

你可以只使'fieldNames'和'fieldTypes' vals'而不是'vars'。 – marstran

+0

这个问题是关于'def's而不是'var's,但问题和解决方案是一样的。 –

+0

@AlexeyRomanov我不认为这是你提到的问题的重复。我对“def”没有任何问题,我成功实现了抽象方法。我有一个与fieldTypes_ $ eq方法有关的问题,它似乎与“fieldTypes”var有关。 –

回答

1

两个问题。

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

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

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

+0

不,问题是2.Scala中的'_'被正确地转换成Java的'''通配符,你可以在错误信息中看到它。 –