gpt4 book ai didi

java - 不覆盖接口(interface)默认实现时编译失败

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:57 26 4
gpt4 key购买 nike

我正在尝试实现org.apache.spark.sql.Row。接口(interface)有几个方法的默认实现,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>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</execution>
</executions>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

如有任何帮助,我们将不胜感激!

最佳答案

我正在将我的评论变成答案,以便您可以将此问题标记为已回答。

TL;DR:如果特征是由早于 2.12 的 Scala 版本编译的,则无法在 Java 中使用 Scala 特征的默认实现。这里使用的 Spark 版本就是这种情况,所以一切希望都破灭了。

原因与 Scala 编译器如何编码特征以与 JVM(从而与 Java)兼容有关。

在 Java 8 之前,不允许接口(interface)提供默认实现。 Scala 特征基本上是具有默认实现的可堆叠接口(interface),必须编码为具有没有实现的接口(interface)和提供实现的抽象类。有关详细信息,请参阅this answer .

Java 8 之后,接口(interface)被允许提供默认实现,因此 Scala 可以将具有默认实现的特征直接编码为 Java 接口(interface),并直接与 Java 代码兼容。从 Scala 2.12 开始,Scala 需要兼容 Java 8+ 的 JVM,因此带来了特征<->接口(interface)兼容性。如果 Scala 代码已由 Scala 2.12+ 编译器编译,您可以将其特征用作普通 Java 接口(interface)。

关于java - 不覆盖接口(interface)默认实现时编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com