我有像编译好的java代码。
import org.jaitools.numeric.Range;
Range<Integer> r1 = Range.create(1, true, 4, true);
像
一样转换为Scalaval r1: org.jaitools.numeric.Range[Integer] = org.jaitools.numeric.Range.create(1, true, 4, true)
编译失败,因为java似乎采用了这种方法:
public static <T extends Number & Comparable> Range<T> create(T minValue, boolean minIncluded, T maxValue, boolean maxIncluded) {
return new Range<T>(minValue, minIncluded, maxValue, maxIncluded);
}
而Scala编译器将选择使用
public static <T extends Number & Comparable> Range<T> create(T value, int... inf) {
return new Range<T>(value, inf);
}
即。类型参数不匹配。
两者都是同一类中的重载方法。 如何让Scala编译器选择正确的方法?
val r1: org.jaitools.numeric.Range[Integer] = org.jaitools.numeric.Range.create(1, true, 4, true)
结果
overloaded method value create with alternatives:
[T <: Number with Comparable[_]](x$1: T, x$2: Int*)org.jaitools.numeric.Range[T] <and>
[T <: Number with Comparable[_]](x$1: T, x$2: Boolean, x$3: T, x$4: Boolean)org.jaitools.numeric.Range[T]
cannot be applied to (Int, Boolean, Int, Boolean)
val r1: org.jaitools.numeric.Range[Integer] = org.jaitools.numeric.Range.create(1, true, 4, true)
也许这也是convert java to scala code - change of method signatures的情况,其中java和Scala的类型系统不能很好地协同工作?
答案 0 :(得分:2)
您的问题是Int
和java.lang.Integer
是两回事。 create
期望其第一个和第三个参数与type参数的类型相同。您将参数指定为Integer
,但您传入的参数 - 1和4 - 的类型为Int
。
您无法创建Range[Int]
,因为类型参数需要扩展Number
和Comparable
,而Int
则不需要。因此,您必须将Int
明确地包含在Integer
val r1 = org.jaitools.numeric.Range.create(Integer.valueOf(1), true, Integer.valueOf(4), true)