-3

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

结果:方法调用addList成功,也可以检索存储在 中的对象ArrayList并打印它们。

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

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

这是否得出结论钻石运算符约束仅在将对象插入集合中时?

请注意,泛型擦除是不同的问题,不提供此问题的答案。

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());
    }
}

}
4

2 回答 2

-1

好的,如果您在谈论那个钻石运算符,它被称为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, floatchar而只支持包装类?

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

你还会注意到一件事<? extends/super SomeType>,那是什么

它的简单继承和多态性。

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

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

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

编辑 :

代表什么??? ? 表示 Object 类,当用作 时Type<?>,意味着你不能添加任何东西objectsObject class只能添加。

于 2016-06-04T06:41:22.317 回答
-1

我建议您快速浏览一下Oracle 教程。基本上泛型是对编译器的提示,仅此而已。它们在编译时进行评估。

于 2016-06-04T06:28:16.517 回答