Java 如何从ArrayList添加两个对象<;对象>;?

Java 如何从ArrayList添加两个对象<;对象>;?,java,object,arraylist,Java,Object,Arraylist,我最近开始学习Java的ArrayList类,并了解了如何使用ArrayList保存不同类类型的元素。然而,这个问题把我弄糊涂了 我回答这个问题的一般思维模式是,我们可以先排除答案A和B,因为编译器会抱怨在两个未强制转换的对象上使用+操作符。但是,当我查看答案C和D时,我觉得它们都可以正常工作,因为它们都将list.get()返回的值强制转换为定义运算符+的类型。这让我选择了答案E,因为我相信C和D都可以在这段代码中工作 然而,正如你所看到的,E是错误的答案。为了使我的困惑更加复杂,我在rep

我最近开始学习Java的
ArrayList
类,并了解了如何使用
ArrayList
保存不同类类型的元素。然而,这个问题把我弄糊涂了

我回答这个问题的一般思维模式是,我们可以先排除答案A和B,因为编译器会抱怨在两个未强制转换的对象上使用
+
操作符。但是,当我查看答案C和D时,我觉得它们都可以正常工作,因为它们都将
list.get()
返回的值强制转换为定义运算符
+
的类型。这让我选择了答案E,因为我相信C和D都可以在这段代码中工作

然而,正如你所看到的,E是错误的答案。为了使我的困惑更加复杂,我在repl.it上测试了这段代码,确认答案选项A和B导致编译错误,而答案选项C和D都将正确的
9
值存储到
I
中。所以现在,我真的很困惑。我在这里对
Object
s有什么规则吗?有人能给我指出正确的方向吗

  • Object
    as类型参数允许集合保存任何类型的java对象
  • 虽然这简化了编写程序,但它给读者带来了巨大的负担,使他们无法验证类型以避免运行时
    ClassCastException
    s。它的行为类似于前泛型世界
  • 关于为什么在
    c
    d
    中允许使用
    list.get()

  • 将首先调用
    list.get(0)
    ,并将结果强制转换为
    int
    。(由于存储在
    0
    的值的类型是
    Integer
    ,因此转换为
    int
    -实际上转换为
    Integer
    ,然后取消绑定到
    int
  • 同样适用于
    list.get(2)
  • 如果您的意思是在进行方法调用之前强制转换引用,那么它将看起来像
    ((int)list).get(0))
    。不幸的是,由于所使用的类型,这是无效的
  • 更多
  • 实际上,在列表中添加一个长的
    list.add(1L)
  • List List=new ArrayList();
    列表。添加(1L);
    (int)list.get(0)+(int)list.get(0);
    
  • 将其强制转换为
    int
    将导致运行时
    ClassCastException
    (类似于
    Long的内容不能转换为整数
  • 这是因为,即使我们应用cast-as原语
    int
    ,它实际上基于引用(对象类型)对对象层次结构进行评估,并发现
    Integer
    Long
    是同级的,没有直接的层次结构,因此抛出
    ClassCastException

  • 我可以确认c和d都应该工作。看起来测试中出现了错误。这是一个多选答案还是您应该只选择一个选项?“不止一个”是什么意思?当您知道两个数字相加的其他方法时,是否应该选择
    e
    ?如果是,那么
    e
    也是正确的,因为还有其他几种方法可以填补“空白”。我想说,“c”是更正确的答案,因为对
    int
    的转换在整个
    列表中进行。get()
    操作。关键短语是
    更正确
    @biggay这两个语句完全等效,因为撤销限制(
    )的优先级高于强制转换。这就是为什么在调用
    y
    之前,如果要将
    x
    强制转换为
    Whatever
    ,则需要执行
    ((任意)x).y()method@BigGuy抱歉,方法调用,不是解除引用。来不及编辑我的评论了