我有 Scala - 帶有 2.13 版 Scala 的 java 多語言專案
下面是標準的專案結構
$scala-java-extend-demo on master
± tree .
.
├── build.gradle.kts
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── src
├── main
├── java
│ ├── Collector.java
│ ├── Function.java
│ ├── JProcessAllWindowFunction.java
│ └── Window.java
├── resources
└── scala
└── ScalaProcessAllWindowFunctionWrapper.scala
24 directories, 15 files
下面是 Collector.java
public interface Collector<T> {
void collect(T record);
void close();
}
下面是 Function.java
public interface Function extends java.io.Serializable {}
下面是 Window.java
public abstract class Window {
public abstract long maxTimestamp();
}
下面是 JProcessAllWindowFunction.java
public abstract class JProcessAllWindowFunction<IN, OUT, W extends Window> {
private static final long serialVersionUID = 1L;
public void process(Context context, Iterable<IN> elements, Collector<OUT> out){}
public void clear(Context context) {}
public abstract class Context {
public abstract W window();
public abstract <X> void output( X value);
}
}
下面是ScalaProcessAllWindowFunctionWrapper.scala延伸的JProcessAllWindowFunction
import java.lang
final class ScalaProcessAllWindowFunctionWrapper[IN, OUT, W <: Window] extends JProcessAllWindowFunction[IN, OUT, W] {
override def process(context: JProcessAllWindowFunction[IN, OUT, W]#Context, elements: lang.Iterable[IN], out: Collector[OUT]): Unit = ???
}
當我編譯專案時,出現以下錯誤 -
> scala-java-extend-demo on master $ ± gradle clean build > Task :compileScala FAILED [Error] /Users/myuser/Coding/misc/scala-java-extend-demo/src/main/scala/ScalaProcessAllWindowFunctionWrapper.scala:4: method process overrides nothing. Note: the super classes of class ScalaProcessAllWindowFunctionWrapper contain the following, non final members named process: def process: ((context: _1.Context, elements: Iterable[IN], out: Collector[OUT]): Unit) forSome { val _1: ScalaProcessAllWindowFunctionWrapper[IN,OUT,W] } one error found FAILURE: Build failed with an exception.
該專案是在github這里。
我該如何解決這個錯誤?
uj5u.com熱心網友回復:
在ScalaProcessAllWindowFunctionWrapper修改方法的簽名中
def process(context: JProcessAllWindowFunction[IN, OUT, W]#Context, elements: lang.Iterable[IN], out: Collector[OUT]): Unit = ???
到
def process(context: Context, elements: lang.Iterable[IN], out: Collector[OUT]): Unit = ???
即JProcessAllWindowFunction[IN, OUT, W]#Context用路徑依賴型別Context又名替換型別投影this.Context。型別投影是一種典型的 Java 型別,可以覆寫那里但在 Scala 中這里的型別過于粗糙。
在JavaContext方法JProcessAllWindowFunction<IN, OUT, W>.Context,即JProcessAllWindowFunction[IN, OUT, W]#Context在斯卡拉。但在 Scala 中Context意味著this.Context.
this.Context和x.Context(對于特定的x: JProcessAllWindowFunction[IN, OUT, W])是 的子型別JProcessAllWindowFunction[IN, OUT, W]#Context。
為什么選擇帶有散列而不是點的 Scala 型別成員?
型別投影有什么用?
`#` 運算子在 Scala 中是什么意思?
Scala 的路徑依賴型別是什么意思?
路徑依賴型別和依賴型別有什么區別?
路徑依賴型別是型別投影嗎?
還要override向processin添加修飾符ScalaProcessAllWindowFunctionWrapper并final從processin 中洗掉修飾符JProcessAllWindowFunction。
uj5u.com熱心網友回復:
您應該能夠使用this以下方法覆寫它:
import java.lang
final class ScalaProcessAllWindowFunctionWrapper[IN, OUT, W <: Window] extends JProcessAllWindowFunction[IN, OUT, W] {
override def process(context: this.Context, elements: lang.Iterable[IN], out: Collector[OUT]): Unit = ???
}
您還應該洗掉方法final上的修飾符process
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311184.html
