Java:引发设置大小列表问题UnsupportedOperationException

Java:引发设置大小列表问题UnsupportedOperationException,java,list,Java,List,我在更改Java中具有设置大小的列表时遇到问题 我知道我不能添加或删除此列表,但为什么我不能使用set? 当我使用set时,会抛出UnsupportedOperationException,当我使用预期的add和remove时也会抛出UnsupportedOperationException 设置 我理解这是一个可选操作,它只是想用另一个元素替换列表中的一个元素。 我有什么办法可以做到这一点吗 编辑: 我正在使用LinkedList 这是我的问题的堆栈跟踪 java.lang.Unsupport

我在更改Java中具有设置大小的列表时遇到问题

我知道我不能添加或删除此列表,但为什么我不能使用set? 当我使用set时,会抛出UnsupportedOperationException,当我使用预期的add和remove时也会抛出UnsupportedOperationException

设置

我理解这是一个可选操作,它只是想用另一个元素替换列表中的一个元素。 我有什么办法可以做到这一点吗

编辑: 我正在使用LinkedList

这是我的问题的堆栈跟踪

java.lang.UnsupportedOperationException: Add to an immutable TypedListIterator
    at polyglot.util.TypedList.tryIns(TypedList.java:195)
    at polyglot.util.TypedList.set(TypedList.java:148)
    at itype.visit.ItypeChecker.enter(ItypeChecker.java:114)
    at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:245)
    at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
    at polyglot.ast.Node_c.visitChild(Node_c.java:173)
    at polyglot.ast.Node_c.visitList(Node_c.java:233)
    at polyglot.ast.ClassBody_c.visitChildren(ClassBody_c.java:63)
    at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
    at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
    at polyglot.ast.Node_c.visitChild(Node_c.java:173)
    at polyglot.ast.ClassDecl_c.visitChildren(ClassDecl_c.java:159)
    at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
    at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
    at polyglot.ast.Node_c.visitChild(Node_c.java:173)
    at polyglot.ast.Node_c.visitList(Node_c.java:233)
    at polyglot.ast.SourceFile_c.visitChildren(SourceFile_c.java:121)
    at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
    at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
    at polyglot.ast.Node_c.visit(Node_c.java:177)
    at polyglot.frontend.VisitorPass.run(VisitorPass.java:56)
    at polyglot.frontend.Scheduler.runPass(Scheduler.java:596)
    at polyglot.frontend.Scheduler.runGoal(Scheduler.java:499)
    at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:440)
    at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
    at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
    at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
    at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:364)
    at polyglot.frontend.Scheduler.runToCompletion(Scheduler.java:297)
    at polyglot.frontend.Compiler.compile(Compiler.java:171)
    at polyglot.frontend.Compiler.compileFiles(Compiler.java:138)
    at polyglot.main.Main.start(Main.java:119)
    at polyglot.main.Main.start(Main.java:82)
    at polyglot.pth.SourceFileTest.invokePolyglot(SourceFileTest.java:162)
    at polyglot.pth.SourceFileTest.runTest(SourceFileTest.java:60)
    at polyglot.pth.AbstractTest.run(AbstractTest.java:32)
    at polyglot.pth.TestSuite.runTest(TestSuite.java:64)
    at polyglot.pth.ScriptTestSuite.runTest(ScriptTestSuite.java:55)
    at polyglot.pth.AbstractTest.run(AbstractTest.java:32)
    at polyglot.pth.Main.start(Main.java:41)
    at polyglot.pth.Main.main(Main.java:11)
列表是一个接口。它(像集合一样)定义可选操作。 可选操作是接口的一部分(为了一致性),但不能保证子类型会真正支持它们(这有点违反行为子类型)。换句话说,并非所有列表的实际实现都必须支持这些操作,它们只需要记录是否支持这些操作

您实际使用的列表类型是什么?ArrayList?链接列表?自定义类型

就我所知,ArrayList确实支持set操作。 我对LinkedList不太清楚
如果您有一个自定义实现,它可能不支持它,除非您重写该方法。

List
不是一个类,它只是一个接口。您是否正在实施自己的
列表
?还是使用预定义的


如果是
List
的某个第三部分库实现,则该实现可能根本不支持该操作(因此是例外)。

您可以从stacktrace中看到它,所使用的
List
是一个,可以构造为不可变的

调用
tryIns
,检查列表是否不可变():



正如您已经发现的那样,
set
是一个
可选操作
,此列表的实现不允许更改(如果构造为不可变)。

以下是一些修复建议

  • 如果代码创建了原始列表,则更改构造函数调用,使其可变
  • 否则,如果
    itypecker.enter()
    中的代码允许您替换列表引用,您可以创建一个可变列表并使用它
  • e、 g


    java.util.List
    是一个接口。您使用的是哪种实现?听起来您使用的是Collections.unmodifiableList,它不可修改,不仅在大小上,而且在内容上。根据Sun的说法,LinkedList应该支持该操作。实际上,有没有办法确定它是什么类型的列表?因为我最初将其设置为LinkedList,但后来将其设置为另一个列表(类型我不确定)@tuckster:我认为您可以通过发布异常的stacktrace来回答所有问题(不是全部)。找出list
    System.out.println(yourList)的类型
    应该为您提供信息。不应该是注释而不是答案?我的问题通过创建一个新的TypedList并将旧列表中的所有元素以及我希望添加到列表或更改的新元素插入到新列表中来解决。
    java.lang.UnsupportedOperationException: Add to an immutable TypedListIterator
        at polyglot.util.TypedList.tryIns(TypedList.java:195)
        at polyglot.util.TypedList.set(TypedList.java:148)
        at itype.visit.ItypeChecker.enter(ItypeChecker.java:114)
        at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:245)
        at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
        at polyglot.ast.Node_c.visitChild(Node_c.java:173)
        at polyglot.ast.Node_c.visitList(Node_c.java:233)
        at polyglot.ast.ClassBody_c.visitChildren(ClassBody_c.java:63)
        at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
        at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
        at polyglot.ast.Node_c.visitChild(Node_c.java:173)
        at polyglot.ast.ClassDecl_c.visitChildren(ClassDecl_c.java:159)
        at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
        at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
        at polyglot.ast.Node_c.visitChild(Node_c.java:173)
        at polyglot.ast.Node_c.visitList(Node_c.java:233)
        at polyglot.ast.SourceFile_c.visitChildren(SourceFile_c.java:121)
        at polyglot.visit.NodeVisitor.visitEdgeNoOverride(NodeVisitor.java:251)
        at polyglot.visit.NodeVisitor.visitEdge(NodeVisitor.java:217)
        at polyglot.ast.Node_c.visit(Node_c.java:177)
        at polyglot.frontend.VisitorPass.run(VisitorPass.java:56)
        at polyglot.frontend.Scheduler.runPass(Scheduler.java:596)
        at polyglot.frontend.Scheduler.runGoal(Scheduler.java:499)
        at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:440)
        at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
        at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
        at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:412)
        at polyglot.frontend.Scheduler.attemptGoal(Scheduler.java:364)
        at polyglot.frontend.Scheduler.runToCompletion(Scheduler.java:297)
        at polyglot.frontend.Compiler.compile(Compiler.java:171)
        at polyglot.frontend.Compiler.compileFiles(Compiler.java:138)
        at polyglot.main.Main.start(Main.java:119)
        at polyglot.main.Main.start(Main.java:82)
        at polyglot.pth.SourceFileTest.invokePolyglot(SourceFileTest.java:162)
        at polyglot.pth.SourceFileTest.runTest(SourceFileTest.java:60)
        at polyglot.pth.AbstractTest.run(AbstractTest.java:32)
        at polyglot.pth.TestSuite.runTest(TestSuite.java:64)
        at polyglot.pth.ScriptTestSuite.runTest(ScriptTestSuite.java:55)
        at polyglot.pth.AbstractTest.run(AbstractTest.java:32)
        at polyglot.pth.Main.start(Main.java:41)
        at polyglot.pth.Main.main(Main.java:11)
    
    private  final void tryIns(Collection coll) {
      if (immutable)
        throw new UnsupportedOperationException JavaDoc(
                        "Add to an immutable TypedListIterator");
    
    List immutable = ....; // your immutable list
    List mutable = new LinkedList(immutable);
    // pass `mutable` to the rest of your code so the new list is used