将scala`Comparable`数组传递给java泛型方法

时间:2016-04-23 04:11:34

标签: java scala generics comparable

我在库中有这些类:

// This is java
public abstract class Property<T extends Comparable<T>> {
     public static Property<T> create(String str) { /* Some code */ }
}
public class PropertyInt extends Property<Integer> {
     public static PropertyInt create(String str) { /* Some code */ }
}
public class PropertyDouble extends Property<Double> {
     public static PropertyDouble create(String str) { /* Some code */ }
}

并且有一个方法可以获取我想要使用的Property列表:

public void state(Property... properties) {
    /* some code */
}

我无法更改上述内容,因为它们来自库。 在scala中,我有以下代码尝试将数组传递给void state(Property...)

// This is scala
val propertyInt = PropertyInt.create("index")
val propertyDouble = PropertyDouble.create("coeff")
state(Array[Property](proeprtyInt, propertyDouble)))

最后一行代码有错误:Type mismatch, expected Property[_ <: Comparable[T]], actual Array[Property]如何解决此问题?

注意:这是一些更复杂的代码的简化版本。在实际代码中,Property<T extends Comparable<T>>实现了接口IProperty<T extends Comparable<T>>IProperty被视为state的参数。

编辑:以下

 val properties = Array(propertyInt.asInstanceOf[IProperty[_ <: Comparable[_]]],
                  propertyDouble.asInstanceOf[IProperty[_ <: Comparable[_]]])
 state(properties)

给出错误

Error:(54, 33) type mismatch;
found   : Array[Property[_ >: _$3 with _$1 <: Comparable[_]]] where type _$1 <: Comparable[_], type _$3 <: Comparable[_]
required: Property[?0] forSome { type ?0 <: Comparable[?0] }
    state(properties)
          ^

1 个答案:

答案 0 :(得分:0)

您需要将state参数更改为通用:

public static void state(Property<?> ... properties) {
  /* some code */
}

然后你可以这样做:

// This is scala
val propertyInt = PropertyInt.create("index")
val propertyDouble = PropertyDouble.create("coeff")

state(propertyInt, propertyDouble)

state(Array(propertyInt, propertyDouble):_*)

更新如果您无法更改state的签名,您仍然可以这样称呼它:

state(Array[Property[_]](propertyInt, propertyDouble):_*)