我正在努力實施org.apache.spark.sql.Row. 接口有幾個方法的默認實現,IntelliJ 不會抱怨沒有重寫這些方法。但是,當使用 Maven 構建時,我得到:FunctionalRow is not abstract and does not override abstract method mkString(java.lang.String,java.lang.String,java.lang.String) in org.apache.spark.sql.Row下面是類的實現:import java.util.List;import java.util.function.Supplier;import org.apache.spark.sql.Row;import scala.collection.JavaConverters;import scala.collection.Seq;public class FunctionalRow implements Row { protected List<Supplier<Object>> suppliers; public FunctionalRow(List<Supplier<Object>> suppliers) { this.suppliers = suppliers; } @Override public int length() { return suppliers.size(); } @Override public Object get(int i) { return suppliers.get(i).get(); } @Override public Row copy() { return this; } @Override public Seq<Object> toSeq() { return JavaConverters.asScalaIteratorConverter(suppliers.stream().map(s -> s.get()).iterator()).asScala().toSeq(); }}maven-編譯器-插件設置: <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <executions> <execution> <id>default-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </execution> <execution> <id>default-testCompile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals>任何幫助,將不勝感激!
1 回答

www說
TA貢獻1775條經驗 獲得超8個贊
TL;DR:如果特征是由早于 2.12 的 Scala 版本編譯的,則不能在 Java 中使用 Scala 特征的默認實現。這里使用的 Spark 版本就是這種情況,所以一切希望都破滅了。
原因與 Scala 編譯器如何編碼特征以與 JVM(從而與 Java)兼容有關。
在 Java 8 之前,不允許接口提供默認實現。Scala 特征基本上是具有默認實現的可堆疊接口,必須編碼為具有沒有實現的接口和提供實現的抽象類。
Java 8 之后,接口被允許提供默認實現,因此 Scala 可以將具有默認實現的特征直接編碼為 Java 接口,并直接與 Java 代碼兼容。從 Scala 2.12 開始,Scala 需要兼容 Java 8+ 的 JVM,因此帶來了特征<->接口兼容性。如果 Scala 代碼已由 Scala 2.12+ 編譯器編譯,則可以將其特征用作普通 Java 接口。
添加回答
舉報
0/150
提交
取消