为什么在下面的代码中没有抛出ArrayStoreException?

Dhanaraj durairaj
private static void genericArrayTest() {
    ArrayList<? extends Exception>[] exceptionListArray = new ArrayList[10]; 
    Object[] exceptionObjectListArray  = exceptionListArray;

    ArrayList<String> wrongArrayList = new ArrayList<String>();
    wrongArrayList.add("String One");

    ArrayList<NullPointerException> exceptionList = new ArrayList<>();

    ArrayList rawList = new ArrayList();

    exceptionListArray[0] = exceptionList;
    //exceptionListArray[0] = wrongArrayList; // Compile error?
    //exceptionListArray[0] = rawList;

    exceptionObjectListArray[0] = wrongArrayList; 
// No compile time error, there is no ArrayStoreException why ?

    ArrayList<? extends Exception> list = exceptionListArray[0]; // No exception here as well ??
    Exception e = list.get(0); 
// Exception only when accessing data, why not ArrayStoreException when we stored wrong list ??
    System.out.println();
}

有人可以解释发生了什么吗?

谷歌搜索说下面的数组声明是允许的,
ArrayList<Exception>[] exceptionListArray = new ArrayList[10];
但是
ArrayList<Exception>[] exceptionListArray = new ArrayList<Exception>[10];
这两个声明之间有什么区别?为什么一个不允许其他声明?

创建一个数组来存储Java中的泛型类型是在谈论如何创建泛型数组。但是这个问题不是关于如何创建通用数组,而是关于为什么在运行时不抛出ArrayStoreException以及Java中通用数组创建语法的差异

Radiodef

在Java中,泛型参数化没有一个将它们彼此区分的类:

ArrayList<Exception> : class is ArrayList
ArrayList<String>    : class is ArrayList

这是因为泛型是使用类型Erase实现的,这意味着在编译期间,它们将被强制类型替换:

ArrayList<Exception> list = new ArrayList<Exception>();
list.add(new Exception());
Exception e = list.get(0);

变成:

ArrayList list = new ArrayList();
list.add(new Exception());
Exception e = (Exception) list.get(0);

ArrayStoreException抛出No的原因是ArrayList<Exception>ArrayList<String>在程序执行期间它们具有相同的类型。

不允许使用通用数组,因为在执行期间无法对类型参数执行这些检查。(因为类型参数不再存在。)

当我们有这个:

ArrayList<Exception>[] a =
    new ArrayList[10];

这称为未经检查的转换。a实际上是ArrayList[]一个数组,它存储任何内容,ArrayList但我们基本上已经说过“假装ArrayList<Exception>[]暂时是”a指向的数组对象仍然是ArrayList[]


请参阅以下程序进行说明:

import java.util.*;

class Example {
    public static void main(String[] args) {
        ArrayList<Exception> a = new ArrayList<Exception>();
        ArrayList<String>    b = new ArrayList<String>();

        System.out.println("ArrayList<Exception> class is:");
        System.out.println("\t" + a.getClass());
        System.out.println("ArrayList<String> class is:");
        System.out.println("\t" + b.getClass());
        System.out.println(
            "ArrayList<Exception> class == ArrayList<String> class:");
        System.out.println("\t" + ( a.getClass() == b.getClass() ));

        ArrayList<Exception>[] c = new ArrayList[0];
        ArrayList<String>[]    d = new ArrayList[0];

        System.out.println("ArrayList<Exception>[] class is:");
        System.out.println("\t" + c.getClass());
        System.out.println("ArrayList<String>[] class is:");
        System.out.println("\t" + d.getClass());
        System.out.println(
            "ArrayList<Exception>[] class == ArrayList<String>[] class:");
        System.out.println("\t" + ( c.getClass() == d.getClass() ));
    }
}

http://ideone.com/dfCZjy

输出:

ArrayList<Exception> class is:
    class java.util.ArrayList
ArrayList<String> class is:
    class java.util.ArrayList
ArrayList<Exception> class == ArrayList<String> class:
    true
ArrayList<Exception>[] class is:
    class [Ljava.util.ArrayList;
ArrayList<String>[] class is:
    class [Ljava.util.ArrayList;
ArrayList<Exception>[] class == ArrayList<String>[] class:
    true

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这个while循环没有在下面的代码中结束?

来自分类Dev

为什么 $scope 在下面的代码中没有定义在这里

来自分类Dev

为什么我的控制器没有在下面的代码中注册?

来自分类Dev

在下面的代码中,为什么会提示“OUCH”?

来自分类Dev

为什么下面的Parse代码没有返回错误?

来自分类Dev

为什么输出是这在下面的Java代码?

来自分类Dev

我在下面的程序中使用angularjs在php上工作,我没有从ajax call获得任何响应。我没有在下面的代码中得到什么错了

来自分类Dev

类成员B的析构函数,为什么在下面的代码段中调用它?

来自分类Dev

为什么onclick函数在下面的Javascript代码段中不起作用?

来自分类Dev

为什么布尔在下面的代码中不采用true或false

来自分类Dev

为什么全局声明 row 和 col 在下面的代码中不起作用

来自分类Dev

_name_estimators 在下面的代码中做了什么?

来自分类Dev

为什么下面的python代码会抛出内存错误?

来自分类Dev

函数和下标之间有什么区别,尤其是在下面的代码中?

来自分类Dev

为什么在下面的scala代码中使用了内部函数,没有内部函数我们不能编写它

来自分类Dev

为什么我在下面的函数中得到unboundLocalError?

来自分类Dev

为什么在下面的代码中使用$ this&如果我不使用则发生什么,并使用$ this我有什么好处?

来自分类Dev

在下面的PLSQL触发器中,为什么将所有内容都在数据透视代码中转换为AS VARCHAR2?

来自分类Dev

在下面的PLSQL触发器中,为什么将所有内容都在数据透视代码中转换为AS VARCHAR2?

来自分类Dev

为什么声明“ void(* pf)(int)= bar;”会在下面的代码段中触发“ static_assert”?

来自分类Dev

为什么在下面的代码中颠倒了规范,以便对一堆对象属性进行多重排序?

来自分类Dev

为什么在下面的代码中数组的索引是一个字符串?

来自分类Dev

为什么我在下面的代码中收到此错误“方法 getHeader(String) 未定义为类型 HttpRequest”?

来自分类Dev

为什么下面的代码编译时没有错误?

来自分类Dev

为什么下面的Lisp代码没有给出期望的结果

来自分类Dev

如何修复此错误“ numpy.ndarray”对象,在下面的代码中没有属性“ append”

来自分类Dev

为什么抛出ArrayStoreException?

来自分类Dev

Java的操作员,+ - 什么是在下面的代码发生的事情,为什么它是这样写的是

来自分类Dev

为什么下面的jspdf代码在下一页打印数据?

Related 相关文章

  1. 1

    为什么这个while循环没有在下面的代码中结束?

  2. 2

    为什么 $scope 在下面的代码中没有定义在这里

  3. 3

    为什么我的控制器没有在下面的代码中注册?

  4. 4

    在下面的代码中,为什么会提示“OUCH”?

  5. 5

    为什么下面的Parse代码没有返回错误?

  6. 6

    为什么输出是这在下面的Java代码?

  7. 7

    我在下面的程序中使用angularjs在php上工作,我没有从ajax call获得任何响应。我没有在下面的代码中得到什么错了

  8. 8

    类成员B的析构函数,为什么在下面的代码段中调用它?

  9. 9

    为什么onclick函数在下面的Javascript代码段中不起作用?

  10. 10

    为什么布尔在下面的代码中不采用true或false

  11. 11

    为什么全局声明 row 和 col 在下面的代码中不起作用

  12. 12

    _name_estimators 在下面的代码中做了什么?

  13. 13

    为什么下面的python代码会抛出内存错误?

  14. 14

    函数和下标之间有什么区别,尤其是在下面的代码中?

  15. 15

    为什么在下面的scala代码中使用了内部函数,没有内部函数我们不能编写它

  16. 16

    为什么我在下面的函数中得到unboundLocalError?

  17. 17

    为什么在下面的代码中使用$ this&如果我不使用则发生什么,并使用$ this我有什么好处?

  18. 18

    在下面的PLSQL触发器中,为什么将所有内容都在数据透视代码中转换为AS VARCHAR2?

  19. 19

    在下面的PLSQL触发器中,为什么将所有内容都在数据透视代码中转换为AS VARCHAR2?

  20. 20

    为什么声明“ void(* pf)(int)= bar;”会在下面的代码段中触发“ static_assert”?

  21. 21

    为什么在下面的代码中颠倒了规范,以便对一堆对象属性进行多重排序?

  22. 22

    为什么在下面的代码中数组的索引是一个字符串?

  23. 23

    为什么我在下面的代码中收到此错误“方法 getHeader(String) 未定义为类型 HttpRequest”?

  24. 24

    为什么下面的代码编译时没有错误?

  25. 25

    为什么下面的Lisp代码没有给出期望的结果

  26. 26

    如何修复此错误“ numpy.ndarray”对象,在下面的代码中没有属性“ append”

  27. 27

    为什么抛出ArrayStoreException?

  28. 28

    Java的操作员,+ - 什么是在下面的代码发生的事情,为什么它是这样写的是

  29. 29

    为什么下面的jspdf代码在下一页打印数据?

热门标签

归档