gpt4 book ai didi

java - scala 使用内部类和类型参数覆盖 java 类方法

转载 作者:行者123 更新时间:2023-11-30 11:10:59 25 4
gpt4 key购买 nike

我正在使用 scala 开发一个 java 库。 java中有一个抽象类:

public abstract class SomeClass<I, O> implements Serializable {
public abstract class Context {
public abstract void output(O output)
}
public abstract class ProcessContext extends Context {
public abstract I element()
}

// method to override
public abstract void process(ProcessContext c) throws Exception
...
}

我尝试在 scala 中实现一个子类:

class SubClass extends SomeClass[String, String] {
override def process(c: SubClass.this.type#ProcessContext) {
val elem = c.element()

// problem: elem is not recognized as a string
if (elem.trim.isEmpty) {...}
...
}
}

所以问题是类型参数在 Scala 子类中有点“丢失”。 elem 变量未被识别为字符串。

我在 http://www.somethingsimilar.com/2011/01/13/tricky-things-in-scala/ 看过 Jeff Hodges 的博客,并尝试:

abstract class SSomeClass[I, O] extends DoFn[I, O] {
type Context = DoFn[I, O]#Context
type ProcessContext = DoFn[I, O]#ProcessContext
}
class SubClass extends SSomeClass[String, String] {
...
// same problem as before
}

但同样的问题仍然存在。

有什么建议吗?

谢谢!

最佳答案

这表示 element 的类型是 String。可能有更简单的方法来证明它。 (currentMirror reflect x).symbol 产生 ClassSymbol。

package interop

import reflect.runtime._, universe._

class Subber extends SomeClass[String, String] {
override def process(c: SomeClass[String, String]#ProcessContext) = {
val x = c.element
debug(x)
}
def debug[A: TypeTag](a: A) = Console println implicitly[TypeTag[A]]
}
object Test extends App {
val s = new Subber()
val c = new s.ProcessContext { def element = "hi" ; def output(x: String) = () }
s process c
}

关于java - scala 使用内部类和类型参数覆盖 java 类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568901/

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