2015-11-17 4 views
0

Может кто-нибудь мне помочь? Я пытаюсь передать Java-метод Scala, но я получаю ClassCastException.Возвращение java-списка с помощью метода scala

Это версия Java, которая работает:

private static void addCompoundRecipe(String tag, String tagAddon, AspectList creationAspects, int sizeX, int sizeY, int sizeZ, Object... recipe) 
{ 
    List<Object> compoundRecipe = Arrays.asList(new Object[] {creationAspects, Integer.valueOf(sizeX), Integer.valueOf(sizeY), Integer.valueOf(sizeZ), Arrays.asList(recipe)}); 
    recipelist.put(tag+tagAddon, compoundRecipe); 
} 

recipelist является HashMap. Когда compoundRecipe извлекается через recipelist.get("string") и отливается до List, все идет хорошо.

Здесь приходит проблемное преобразование:

private def addCompoundRecipe(tag: String, tagAddon: String, sizeX: Int, sizeY: Int, sizeZ: Int, aspects: AspectList, recipe: AnyRef*) { 
    val compoundRecipe = java.util.Arrays.asList(Array(sizeX, sizeY, sizeZ, aspects, java.util.Arrays.asList(recipe))) 
    if(compoundRecipe.isInstanceOf[java.util.List[_]]) 
    recipes += (tag+tagAddon -> compoundRecipe) 
    else 
    throw new IllegalArgumentException(s"$tag$tagAddon is not a valid recipe!") 
} 

Вместо recipelist, здесь я использую recipes, непреложный HashMap. Конечно, когда я называю его recipes.apply("string"), я должен бросить его снова, чтобы подогнать его подпись метода, используя .asInstanceOf[java.util.List[_]]

Проблема заключается в том, я получаю ClassCastException:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to thaumcraft.api.aspects.AspectList 

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

EDIT: я уже вставили линию 387, это r.get(0) и ResearchPage простой класс, который имеет конструктор, который принимает java.util.List В параметре, который я пытаюсь сделать. В этом нет необходимости слишком смотреть, потому что это API, и я не могу его изменить, а также потому, что он работал, когда я писал свои материалы на Java. Однако, похоже, у меня проблемы с преобразованиями ... вот что я пытался: `private def addCompoundRecipe (тег: String, tagAddon: String, sizeX: Int, sizeY: Int, sizeZ: Int, аспекты: AspectList , рецепт: ItemStack *) {

val compoundRecipe = (Seq(aspects, sizeX, sizeY, sizeZ, recipe.toSeq)) 
if(recipe != null) recipes += (tag+tagAddon -> compoundRecipe) else 
    throw new IllegalArgumentException(s"$tag$tagAddon is not a valid recipe!") 

}

Вот исключение, которое я получить сейчас: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to java.util.List в той же строке 387, конечно. Итак, я думаю, проблема связана с неявными преобразованиями?

EDIT: это работает:

private def addCompoundRecipe(tag: String, tagAddon: String, sizeX: Int, sizeY: Int, sizeZ: Int, aspects: AspectList, recipe: AnyRef*) { 

val compoundRecipe = Seq(aspects, sizeX, sizeY, sizeZ, recipe.asJava) 
if(recipe != null) recipes += (tag+tagAddon -> compoundRecipe.asJava) else 
    throw new IllegalArgumentException(s"$tag$tagAddon is not a valid recipe!") 

}

+1

Можете ли вы показать больше своего кода в том месте, где вы извлекаете рецепт и пытаетесь его бросить? – Shadowlands

+0

Сообщение об исключении означает, что у вас есть 'Object []' (массив объектов, а не список!), Который вы пытаетесь применить к 'thaumcraft.api.aspects.AspectList'. – Jesper

+0

@Shadowlands: 'ResearchPage [] pages'' pages = new ResearchPage [] {new ResearchPage ((List) recipelist.get («ThaumicGen»)); 'scala version:' pages = Array (новый ResearchPage (recipes.apply) («ThaumicGen»). AsInstanceOf [java.util.List [_]])) ' –

ответ

1

Я думаю, что есть что-то не так с линией val compoundRecipe = java.util.Arrays.asList(Array(sizeX, sizeY, sizeZ, aspects, java.util.Arrays.asList(recipe))), где вы ожидаете получить java.util.List[Any], который содержит sizeX, sizeY ... но, к сожалению, что вы получаете на самом деле java.util.List[Array[Any]], где внутри Array содержит sizeX, sizeY ... Если вы передадите их на вызов метода java, типы не будут проверяться.

Я не думаю, что это хорошая идея, чтобы смешивать типы java и типы scala внутри вашего scala-кода (например, val compoundRecipe = java.util.Arrays.asList ..., или if (compoundRecipe.isInstanceOf[java.util.List[_])). Лучшей практикой является использование типов scala в вашем коде и преобразование только при необходимости (используйте .asJava, как предлагал @ Альваро).

 Смежные вопросы

  • Нет связанных вопросов^_^