2015-07-24 2 views
0

Я импортировал это:Невозможно назначить возвращенный java.util.ArrayList для scala.collection.mutable.ArrayBuffer. Зачем?

import scala.collection.JavaConversions._ 

val size: Int = blubb.getSize 
var fields: ArrayBuffer[Field] = new ArrayBuffer[Field] 

size match 
{ 
    case 1 => fields.append(field) 
    case 2 => fields = field.getNeighbours) 
} 

Теперь getNeighbours возвращает java.util.ArrayList вместо с ArrayBuffer (это класс Java я не имею никакого контроля над).

Компилятор говорит

Выражение типа ArrayList [поле] не соответствует ожидаемому типу ArrayBuffer [Field]

не должны JavaConversions заботиться об этом? Как можно легко преобразовать ArrayList в ArrayBuffer? (Я не хочу, чтобы заменить ArrayBuffer с ArrayList в коде Scala!)

+0

http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConversions$ должно показать, что поддерживается. – wkcamp

+0

Я бы сказал, что обычно предпочтительнее использовать «JavaConverters», а не «JavaConversions», чтобы вы знали (потому что вы явно указываете), что произойдет. – childofsoong

ответ

5

ArrayBuffer особая реализация Buffer, подкрепленная Array. У вас не может быть ArrayBuffer с поддержкой ArrayList.

JavaConversions предлагает конверсионную упаковку от java.util.List до Buffer (не ArrayBuffer).

Либо вы перепечатывать вашу fields переменную как Buffer[Field], или вы должны копию элементы ArrayList к новому ArrayBuffer:

fields = ArrayBuffer(field.getNeighours: _*) 
+0

Ваш второй пример не скомпилируется для меня: case 2 => {fields = ArrayBuffer (field.getNeighbours (новый Vector2 (this.posX, this.posY), world): _ *); fields.append (поле); fieldsCount = 3} Ожидаемый Seq [NotInferedA] фактический ArrayList [Поле] – Sorona

+0

На самом деле ваш первый тоже не работает. Выражение типа ArrayList [Поле] не соответствует ожидаемому типу Буфер [Поле] – Sorona

+0

Hum работает достаточно хорошо для меня: https://gist.github.com/sjrd/7e576814fb16b8623569 – sjrd

0

Поскольку ArrayBuffer не является ArrayList. sjrd предлагает использовать javas, встроенный в преобразование, но вы также можете использовать цикл for для копирования данных из arraylist в новый ArrayBuffer перед его передачей.