Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型在Java中是如何工作的?_Java_Generics - Fatal编程技术网

泛型在Java中是如何工作的?

泛型在Java中是如何工作的?,java,generics,Java,Generics,问题1-为什么arrList1不能只使用字符串 ArrayList arrList1 = new ArrayList<String>(); arrList1.add(10); arrList1.add("Manish"); arrList1.add(0.234); ArrayList arrList1=new ArrayList(); 第1条增补(10); arrList1.添加(“Manish”); arrList1.add(0.234); 问题2-没有编译错误,但给出运行类

问题1-为什么arrList1不能只使用字符串

ArrayList arrList1 = new ArrayList<String>();
arrList1.add(10);
arrList1.add("Manish");
arrList1.add(0.234);
ArrayList arrList1=new ArrayList();
第1条增补(10);
arrList1.添加(“Manish”);
arrList1.add(0.234);

问题2-没有编译错误,但给出运行类型错误为什么

ArrayList<String> arrList2 = new ArrayList<String>();
arrList2 = arrList1;
ArrayList arrList2=new ArrayList();
arrList2=arrList1;

问题3-下面的用法是什么

ArrayList<Integer> arrList3 = new ArrayList<Integer>();
arrList2 = arrList3; //compiler error that's fine
ArrayList arrList3=new ArrayList();
arrList2=arrList3//编译器错误,没关系

问题4-如何在arrList4上执行操作

ArrayList<?> arrList4 = new ArrayList<String>();
//arrList4.add("String"); //compilation error?

arrList4 = new ArrayList<Integer>();
arrList4.add(23); //compilation error?
ArrayList arrList4=新的ArrayList();
//arrList4.添加(“字符串”)//编译错误?
arrList4=新的ArrayList();
第4条增补(23)//编译错误?

问题5-当对象不起作用时,在分配对象时使用泛型是什么?比如在arrList1中

ArrayList<String> arrList5 = new ArrayList();
arrList5.add("String");
arrList5.add(23.3); //compilation error that's fine
ArrayList arrList5=new ArrayList();
arrList5.添加(“字符串”);
第5条增补(23.3)//编译错误,没关系
Q1)泛型是编译时检查。您隐式地将ArrayList强制转换为原始类型,因此编译器不知道您是如何创建它的。为什么允许这样做?为了向后兼容。它必须使用没有泛型的代码。例如Java1.4.2

问题2)您将得到一个运行时错误,因为这些元素与它所期望的类型不匹配,所以无法取出非字符串的元素

Q3)通配符是未知类型。这并不意味着它匹配任何东西。如果您有
?扩展T
,你就知道这是一个T。在很多方面?使其只读,并且仅对返回值有用

Q4)您将其设置为整数的ArrayList,因此您必须添加一个可以装箱到整数的整数或int

Q5)有编译时和运行时检查。几乎在所有情况下都有一种绕过编译时检查的方法(有些方法比其他方法更模糊)。在第一个示例中,您已经关闭了编译器为您检查代码的功能,以便在运行时看到错误。就像你对编译器说的,相信我,我知道我在做什么。
当您执行此操作时,编译器仍将向您发出警告,尽管您也可以使用
@SuppressWarnings(“选中”)

关闭此功能,但Q4的答案不起作用。。。arrList4=新的ArrayList();arrList4.add(新整数(23))//在Q1中给出编译错误,我添加字符串,int,double。它在编译时不检查字符串,但应该在运行时检查字符串(如ArrayList arrList1=new ArrayList()),但工作正常。它迭代并显示。为什么???@ManishAgrawal您的类型是
ArrayList
,因此您无法向列表中添加任何内容。@ManishAgrawal您正在添加字符串、整数和双精度。调用toString时,它将它们视为对象。你们不能做的是把它们当作字符串。是的,我同意它把所有元素都当作对象。如果它是作为对象,那么在ArrayList arrList1=new ArrayList()中泛型有什么用??这里的通用性将如何体现??