Может кто-нибудь мне помочь? Я пытаюсь передать 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!")
}
Можете ли вы показать больше своего кода в том месте, где вы извлекаете рецепт и пытаетесь его бросить? – Shadowlands
Сообщение об исключении означает, что у вас есть 'Object []' (массив объектов, а не список!), Который вы пытаетесь применить к 'thaumcraft.api.aspects.AspectList'. – Jesper
@Shadowlands: 'ResearchPage [] pages'' pages = new ResearchPage [] {new ResearchPage ((List) recipelist.get («ThaumicGen»)); 'scala version:' pages = Array (новый ResearchPage (recipes.apply) («ThaumicGen»). AsInstanceOf [java.util.List [_]])) ' –