Scala中奇怪的类型不匹配

时间:2015-10-03 10:13:59

标签: java scala

我试图调用一个在Scala中使用varargs的构造函数。构造函数是用Java类编写的,它有两个参数,BlockIBlockState...。但是,以下代码似乎无法编译:

new BlockStateList(this, Seq[IBlockState[_ <: Comparable[_]]](FACING, DAMAGE):_*)

编译器报告此消息:

Error:(58, 66) type mismatch;
 found   : Seq[net.minecraft.server.v1_8_R3.IBlockState[_ <: Comparable[_]]]
 required: Seq[net.minecraft.server.v1_8_R3.IBlockState[? <: Comparable[?0]] forSome { type ?0 <: Comparable[?0] }]
   new BlockStateList(this, Seq[IBlockState[_ <: Comparable[_]]](FACING, DAMAGE):_*)
                                      ^

所需的类型对我来说在语法上并不合适,我不知道它希望我提供什么。

非常感谢所有帮助!

1 个答案:

答案 0 :(得分:2)

问题与varargs无关,而与序列的内容无关。

正如我所推断,Comparable仅限于其类型参数。像

这样的东西
trait Comparable[C <: Comparable[C]]

有关此模式,请参阅more info。因此,要表示此类型要求,您需要高级existential types规范。 MyType[_]是完整MyType[A] forSome {type A}的快捷方式。在您的情况下,编译器需要

Seq[IBlockState[_ <: Comparable[C]] forSome { type C <: Comparable[C] }]()

而不是

Seq[IBlockState[_ <: Comparable[_]]]()