为了账号安全,请及时绑定邮箱和手机立即绑定

不覆盖接口默认实现时编译失败

不覆盖接口默认实现时编译失败

桃花长相依 2023-09-20 15:17:23
我正在努力实施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 接口。


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 51 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信