Scala:问题使用java接口

时间:2013-09-04 07:30:13

标签: java scala interface

我想在Scala中使用JemmyFX 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]]

方法“as”:

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之间的使用有限制吗?

1 个答案:

答案 0 :(得分: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]](...)

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