在Grails 2.3.9中,当试图将子类的实例添加到列表中时,出现UnsupportedOperationExcept



我有3个子域扩展父域,像这样:

Dog extends Animal
Cat extends Animal
Snake extends Animal

在我的一个服务中,我有一个List<Animal>,我试图向它添加对象(类狗,猫和蛇),像这样:

List<Animal> animals = Dogs.findAllByBreed("someBreed")
             animals << Cats.findAllBySomething("something")
animals = [animals].flatten()

它在run-app上工作得很好,我没有得到任何错误。然而,在测试应用程序上,我得到UnsupportedOperationException,我发现有点奇怪。

有人能告诉我怎么了吗?我想这应该是可能的,因为狗和猫都是动物。我应该更新它们共同的值,但是测试失败了。下面是堆栈跟踪。

java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at ...

你确定,Dog ---> Dogs.findByBreed("someBreed")工作吗?我以前从未见过这种复数符号…

无论如何,我建议将原始列表包装成ArrayList

List animals = new ArrayList( Dog.findAllByBreed("someBreed") )
     animals.addAll Cat.findAllBySomething("something")

而不是:

List<Animal> animals = Dogs.findAllByBreed("someBreed")
animals << Cats.findAllBySomething("something")
animals = [animals].flatten()

试试这个:

List<Animal> animals = Dogs.findAllByBreed("someBreed")
animals += Cats.findAllBySomething("something")

当您使用animals << Cats.findAllBySomething("something")时,您将List<Cat>添加到List<Animal>,这是无效的。您应该能够将Cat实例添加到List<Animal>,但不能将List实例添加到List<Animal>。当您使用+=时,您将List<Cat>的元素添加到List<Animal>中,这可能是您想要的。

最新更新