2015-10-03 5 views
0

Я пытаюсь вызвать конструктор, который принимает varargs в Scala. Конструктор написан в классе Java и принимает два параметра: Block и IBlockState.... Следующий код не компилировать, однако:Незначительное несоответствие типа в Scala

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):_*) 
            ^

требуемый тип не кажется синтаксически правильным для меня, и я понятия не имею, что он хочет мне предоставить.

Вся помощь очень признательна!

ответ

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[_]]]() 
Смежные вопросы