0

我想使用ScalaJemmyFX Framework中编写的Java. 但是有几个问题我无法解决。

java中,如果我想用 Wrapper 搜索标签,我可以这样做:

Wrap<? extends Label> label = Root.ROOT.lookup().wrap().as(Parent.class, Node.class).lookup(Label.class).wrap();

如果我想在 Scala 中这样做,我没有得到有效的解决方案。我已经以这种方式尝试过:

val label: Wrap[_<:Label] = Root.ROOT.lookup().wrap().as(classOf[Parent[_<:Label]], classOf[Node]).lookup(classOf[Label]).wrap()

但随后 scala 告诉我: - 推断的类型参数[javafx.scene.Node,org.jemmy.interfaces.Parent[_ <: javafx.scene.control.Label]]不符合方法的类型参数边界

 [TYPE,INTERFACE <: org.jemmy.interfaces.TypeControlInterface[TYPE]]

方法“作为”:

public <TYPE, INTERFACE extends TypeControlInterface<TYPE>> INTERFACE as(Class<INTERFACE> interfaceClass, Class<TYPE> type)

方法“查找”:

public abstract <ST extends T> Lookup<ST> lookup(Class<ST> paramClass);

“父”类:

public abstract interface Parent<T> extends TypeControlInterface<T>

所以我不明白,我如何在scala中使用这些接口。有什么解决方案,或者scala和java之间的使用有限制吗?

4

1 回答 1

0

我对 JemmyFX 一无所知,但这是我的 2 美分。这不是 Scala 和 Java 之间的互操作性问题。这是正确键入对as方法的调用的问题。

as方法签名说明这[TYPE, INTERFACE <: TypeControlInterface[TYPE]]意味着 INTERFACE 类型必须与 TYPE 完全相同的类型进行参数化。因此,您不能classOf[Parent[Label]]在第一个参数和classOf[Node]第二个参数中使用:您必须使用其中一个NodeLabel两次。

我尝试使用以下 Scala 代码重现该问题:

trait TypeControlInterface[T]
trait Parent[T] extends TypeControlInterface[T]

trait Node
case class Label(s: String) extends Node

object Test {
  def as[TYPE, INTERFACE <: TypeControlInterface[TYPE]](interfaceClass: Class[INTERFACE], typeClass: Class[TYPE]): INTERFACE = ???

  def main(args: Array[String]) {
    val label1 = as(classOf[Parent[Label]], classOf[Label]) // compiles
    val label2 = as(classOf[Parent[Node]], classOf[Node]) // compiles
    val label3 = as(classOf[Parent[Label]], classOf[Node]) // doesn't compile
  }
}

请注意,如果该as方法是这样定义的:

def as[TYPE, INTERFACE <: TypeControlInterface[_ <: TYPE]](...)

上面示例中的最后一行将被编译。

于 2013-09-05T08:29:53.747 回答