我想在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之间的使用有限制吗?
答案 0 :(得分:0)
我对JemmyFX一无所知,但这是我的2美分。
这不是Scala和Java之间的互操作性问题。这是正确键入您对as
方法的调用的问题。
as
方法签名显示[TYPE, INTERFACE <: TypeControlInterface[TYPE]]
,这意味着INTERFACE类型必须使用与TYPE相同的类型进行参数化。因此,您无法在第一个参数中使用classOf[Parent[Label]]
,在第二个参数中使用classOf[Node]
:您必须使用Node
或Label
两次。
我尝试使用以下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]](...)
上面示例中的最后一行将编译。