【问题标题】:Java Diamond operator in method parameter doesn't validate the type of objects in the collection received as argument from calling method [duplicate]方法参数中的 Java Diamond 运算符不验证从调用方法接收的作为参数的集合中对象的类型 [重复]
【发布时间】:2023-04-09 14:05:02
【问题描述】:

场景:类中的方法 addList 需要 ListInteger 对象。
main 方法发送一个包含多种类型对象的ArrayList 参数,而不仅仅是Integer

结果:调用addList方法成功,也可以取回ArrayList中存储的对象并打印出来。

问题:难道我们不应该期望在运行时在被调用方法中接收到列表时,会验证其内容并导致一些异常吗?

但是,在addList 方法中,如果我尝试在ArrayList 中插入非Integer 对象,它只会在编译时失败。

这是否意味着 Diamond 运算符约束仅在将对象插入到集合中时?

请注意,erasure-in-generics 是不同的问题,不提供此问题的答案。

package com.rnd.nirav;

import java.util.ArrayList;
import java.util.List;

public class OverRidingTest {

public static void main(String[] args) {

    List list = new ArrayList<>();
    list.add(Integer.valueOf(1));
    list.add("Nirav");
    list.add(Float.valueOf(1.1f));

    addList(list);

}

public static void addList(List<Integer> list) {
    list.add("Khandhedia"); // This fails as expected.
    System.out.println("List size = " + list.size());
    Iterator itr = list.iterator();
    while(itr.hasNext())
    {
        System.out.println("Element is " + itr.next());
    }
}

}

【问题讨论】:

    标签: java list arraylist diamond-operator


    【解决方案1】:

    我建议您快速通过an Oracle tutorial。 基本上泛型是对编译器的提示,仅此而已。它们在编译时进行评估。

    【讨论】:

      【解决方案2】:

      好吧,如果你说的是钻石运算符,它被称为generics

      泛型是在编译时而不是在运行时评估的

      为什么是泛型 ??

      唯一的原因是泛型提供类型安全 考虑下面的例子

      public static void addContent() {
              List<Integer> list = new LinkedList<>();
              for (int i = 0; i < 10; i++) {
                  list.add(new Integer(i));
              }
      
          }
      

      为什么我们实际上需要generics??

      这样我们的内容就不会像你不想添加或混合salt to sugar一样被变异,在这里你不能添加任何其他类型的对象 因此变得易于访问和处理(例如易于访问一种类型的对象)。例如。

      for (Integer i : list) {
                  System.out.println(i);
              } 
      

      那个菱形操作符是做什么的?

      它在编译时提供类型安全,比如帮助停止,而 adding salt to sugar 就像

      list.add("hello"); //not possible
      

      为什么它不支持 int , float,char 而只支持包装类?

      因为java只围绕对象,我们都知道int,float and char类型没有对象

      还有一件事你会注意到&lt;? extends/super SomeType&gt;,那是什么

      它的简单继承和多态性。

      为什么您的代码不检查某一特定类型

      这是因为您没有将代码绑定到任何类型,因此您可以将任何对象添加到集合中

      编辑 1:您的代码并没有完美运行

      编辑:

      ? 代表什么?? ?表示 Object 类,当用作 Type&lt;?&gt; 时,意味着您只能添加 objectsObject class 之外的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-30
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        相关资源
        最近更新 更多