精华内容
下载资源
问答
  • java为什么不能创建泛型数组java为什么不能创建泛型数组 在《java核心技术(第11版)》p338中写到不能创建参数化类型(泛型)的数组。 java为什么不能创建泛型数组 引入泛型就是为了提高程序的安全性。数组在编译...

    java为什么不能创建泛型数组

    在《java核心技术(第11版)》p338中写到不能创建参数化类型(泛型)的数组。

    java为什么不能创建泛型数组

    引入泛型就是为了提高程序的安全性。数组在编译期间会类型擦除如Pair[]数组就会转换为Object[]数组。如果能创建泛型数组,那么就可以往里面放任何类型的对象(如Integer、String等等),这就违反了泛型的原则。破坏了程序的安全性。

    展开全文
  • 之前只是知道在 Java 中不能创建泛型数组 现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情况: // 假设可以创建泛型数组 List<String>[] stringLists = new ArrayList<String>[1]...

     

    之前只是知道在 Java 中不能创建泛型数组

     

    现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情况:

    复制代码

    // 假设可以创建泛型数组
    List<String>[] stringLists = new ArrayList<String>[1];
    List<Integer> intList = Arrays.asList(42);
    // 泛型擦除,List 继承自 Object,所以可以如此赋值
    // 在数组中,子类数组 是 父类数组 的子类,Object[] o = new ArrayList[1];
    Object[] objects = stringLists;
    // 同理,泛型擦除后,List 类型变量赋值给 Object 类型变量
    // 但此时出现问题了,**** List<Integer> 实例添加到了声明为 List<String>[] 类型的数组中了 ******
    objects[0] = intList;
    String s = stringLists[0].get(0);

    复制代码

    由于泛型擦除,结果就是泛型的检查作用失效,可以将 List<Integer> 类型的值添加到 List<String>[] 类型的数组中。

    而这类问题在编译时无法发现,只能在运行时出现问题

     

    所以如果禁止创建泛型数组,就可以避免此类问题

    展开全文
  • Java为什么不能创建泛型数组

    万次阅读 多人点赞 2015-12-03 18:06:25
    Java为什么不允许创建泛型数组

    近期看《Java核心技术 卷I》,看到其中有一页说不能创建泛型数组。情形如下:

    public class Pair<T> {
    	public void info( )
    	{
    		System.out.println("I am Pair");
    	}
    }
     
    
    Pair<String>[] p=new Pair<String>[10];//该句编程环境eclipse会提示错误,连编译都不能通过

    为什么Java不允许创建泛型数组?看核心技术里的讲解看不懂,又翻开《疯狂Java讲义》,两本书拼凑,终于看懂了。也曾查阅网上资料,但大都抄来抄去,也是说不明白。

    首先,从一个问题讲起——Java为什么使用泛型?引入泛型的目的之一就是为了提高程序的安全性,减少错误发生,还是用一段更形象的代码来讲吧。请看下面代码

    public class Test {
    	
    	public static void main(String[] args) {
    		
    		ArrayList list=new ArrayList();
    		list.add(new Pair());
    		//list.add(5);
    		Pair p=(Pair)list.get(0);
    		p.info(); 
    	}
    }


     
    运行上面代码是不会有任何问题的,但是我们稍加改动,即放开被注释掉的那行代码,并将索引改为1,即变为如下代码 
    

    public class Test {
    	
    	public static void main(String[] args) {
    		
    		ArrayList list=new ArrayList();
    		list.add(new Pair());
    		list.add(5);
    		Pair p=(Pair)list.get(1);
    		p.info(); 
    	}
    }


     
    程序将发生java.lang.ClassCastException,很显然,是因为我们把int类型强制转为Pair类型发生的。以上代码是用引入泛型代码之前的方式写的,在引入泛型后,java集合都已经重写以迎合泛型。引入泛型的目的之一就是为了消除这种隐患,于是,泛型的一个原则被引了出来——如果一段代码在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClasscastException异常。 
    

    我们再用泛型的方式来重写一遍上面的代码,如下

    编译环境会提示错误,编译都通不过,于是这便在编译阶段就避免了这种隐患的发生。泛型能够保证类型的统一。

    接下来讲本篇博客的重点——为什么不能创建泛型数组?

    这跟数组的一个特点有关,看代码

    public class Father {
    
    }

    public class Son extends Father{
    
    }
    

    public class Test {
    	
    	public static void main(String[] args) {
    		
    		Father[] son=new Son[10];
    	}
    }
    
    数组是允许把一个子类数组赋给一个父类数组变量的!这会发生什么!?

    public class Test {
    	
    	public static void main(String[] args) {
    		
    		Pair<String>[] p=new Pair<String>[10];//实际这句是不能通过编译的,eclipse会提示错误
    		Object[] oj=p;
    	}
    }
    如果允许创建泛型数组,将能在数组p里存放任何类的对象,并且能够通过编译,因为在编译阶段p被认为是一个Object[ ],也就是p里面可以放一个int,也可以放一个Pair,当我们取出里面的int,并强制转换为Pair,调用它的info()时会怎样?java.lang.ClassCastException!这就违反了泛型引入的原则。所以,Java不允许创建泛型数组。

    有人可能会说,即使我用泛型ArrayList<Pair> list=new ArrayList<Pair>( ),我不是照样可以取出里面的对象,使用显式的强制类型转换吗?比如,Father f=(Father)list.get(0),实际操作你将会发现,你依旧会被提示错误,编译不过,这并不违背泛型引入的原则。


    最后,感谢《Java核心技术 卷I》和《疯狂Java讲义》。

    展开全文
  • 上面的这段代码是可以正常编译的,但在运行这段代码的时候会报异常java.lang.ArrayStoreException这是因为数组创建的时候就确定了元素的类型,并且会记住该类型,每次向数组中添加值的时候,都会做类型检...

    首先我们来看一个简单的例子

    Integer[] intArr = new Integer[1];

    Object[] objArr = intArr;

    objArr[0] = "xxx";

    上面的这段代码是可以正常编译的,但在运行这段代码的时候会报异常java.lang.ArrayStoreException

    这是因为数组在创建的时候就确定了元素的类型,并且会记住该类型,每次向数组中添加值的时候,都会做类型检查,类型不匹配时就会抛异常java.lang.ArrayStoreException

    知道了这个数组类型检查机制后,我们来看看创建泛型类的数组会有什么问题,首先我们创建一个泛型类:

    public class A{

    private T value;

    public A(T value) {

    this.value = value;

    }

    // 省略 get 和 set 方法

    // ...

    }

    我们尝试来创建一个 A 类的数组:

    A[] arr = new A[1]; // 编译错误

    上面的这行代码根本不能通过编译,也就是不允许我们创建泛型数组

    为了解释为什么不能创建泛型数组,这样会带来什么问题,我们假如上面的代码可以通过编译,接着看:

    A[] arr = new A[1];

    Object[] objArr = arr;

    objArr[0] = new A();

    类似我们前面说的那样,我们把 arr 赋给一个 Object[],然后我们往数组中加入 A 类型的值,这样做是可以的,在编译和运行期间都不会报错。因为泛型类型会被擦除,A 和 A 的类型其实是一样的:

    System.out.println(new A().getClass() == new A().getClass());

    // 输出:true

    这样就逃过了数组的类型检查机制,在我们使用中就会造成类型转换错误。

    所以,Java 中不允许创建泛型的数组。

    注意

    有一种绕过“不能创建泛型数组”限制的方法,就是使用强制类型装换:

    A[] arr = (A[]) new A[1];

    当然,这么做是不安全的,当我们向数组中放入一个 A,然后以 String 类型取出时会报异常java.lang.ClassCastException,如下代码所示:

    A[] arr = (A[]) new A[1];

    Object[] objArr = arr;

    objArr[0] = new A(1);

    A a = arr[0];

    String s = a.getValue();

    // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

    展开全文
  • 那么为什么不能创建泛型数组呢,如果想要使用该怎么办呢????? 首先,java中我们不能实例化一个泛型数组,但是确实可以定义一个这样的变量 这是因为,泛型具有擦除机制,在运行时的类型会被擦除为了与之前版本类库的融合...
  • Java不能创建泛型数组的解决方案

    千次阅读 2018-11-07 23:39:29
    Java不能创建泛型数组的解决方案 3.1 通配符 The Java™ Tutorials: Generics给出的解决方案如下: List&amp;amp;amp;lt;?&amp;amp;amp;gt;[] lsa = new List&amp;amp;amp;lt;?&amp;amp;amp;gt;...
  • Java不能创建泛型数组

    2018-11-07 23:13:20
    一,数组的协变性(covariant array type)及集合的非协变性 设有Circle类和Square类继承自Shape类。 关于数组的协变性,看代码: public static double totalArea(Shape[] arr){ double total = 0; for (Shape...
  • 为什么 Java 支持泛型数组

    千次阅读 2018-09-13 08:26:28
    Java 支持泛型数组。也就是说, List&lt;String&gt;[] ls = new ArrayList&lt;String&gt;[10]; 是支持的,而 List&lt;String&gt;[] ls = new ArrayList[10] 却可以。 是我一直...
  • 在Java中,如果创建泛型数组,会出现以下编译错误, 例如 List&lt;String&gt;[] stringLists = new List&lt;String&gt;[10]; 会提示 Error:(9, 38) java: 创建泛型数组 但是却可以创建泛型数组的...
  • 本篇就以泛型数组为例,探讨其创建的方法。下面我们先就一些基本的要点进行梳理,然后带来创建的实例。1、泛型数组说明Java确实是支持声明泛型数组的,当然,更准确的表达是,数组的类型可以是类型变量,除非是...
  • Java 为什么不能创建泛型数组?

    千次阅读 2018-09-23 20:53:03
    泛型是 JDK 1.5 中引入的新特性, 首先我们来思考下 java 为什么要引入泛型, 我们看如下代码: List list = new ArrayList(); list.add(55); list.add("dd"); System.out.println(((Integer) list.get...
  • Java 泛型 泛型数组

    千次阅读 2021-03-09 20:43:19
    直接创建泛型数组不能通过编译,而转型对象数组通过编译但是不能在JVM运行 public class ArrayOfGeneric{static Generic[] gia;@SupperssWarnings("unchecked")public static void main(String[] args){gia = ...
  • 创建一个O []在从FirstClass< O>调用的例程中,其中O是通用类参数.我找到如何执行此操作.我特别需要O [](而不是ArrayList O或类似的东西),因为我需要经常在循环体内获取它的元素,这对我算法的执行时间很...
  • 在java中,可以声明一个泛型数组不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size)的方式来创建数组例如下面的程序。public class ArrayMaker {...
  • 复制代码  Java数组为什么是协变的?在Java的早期版本中,由于没有泛型,而为了能够复用数组的实现,就将数组设计为协变的。但是,如果将数组设计为协变,可能会引发一个问题:类型安全性,例如: Number[] ...
  • Java中创建泛型数组

    2021-02-12 09:45:38
    当我们写出这样的代码时编译器会报Cannot create a generic array of T,初学泛型时,看到这个错就以为Java中不能创建泛型数组,随着不断的深入,当看到Tinking in Java中的泛型时,Java中是可以创建泛型的,真的是...
  • 缘由之前leetcode刷题的时候,某道题试图新建一个HashMap的数组,总是编译出错,然后突然反应过来,Java里是不能按照像通常新建基本类型的数组一样,直接新建泛型数组的。希望我能以比较简单明了的方式说明其中的...
  • Java 必知必会 第 40 篇 ...数组是不能通过泛型创建的,因为我们不能创建不可具体化的类型的数组。如下面的代码: public class GenSet<E> { private E a[]; public GenSet() { a = new...
  • 今天和大家一起探讨如何创建一个泛型数组? 可能会有人说,这还简单,直接 T[] array = new T[size],就可以了嘛? 很可惜,编译器会提示泛型无法直接被实例化。 那我们换个思路,先创建一个 Object 数组,再将...
  • Java自定义泛型数组

    千次阅读 2019-02-13 23:31:05
    1、定义泛型数组相关概念 (1)泛型数组让我们可以存放任何数据类型 (2)存放的类型可以是基本数据类型,只能是类对象 boolean、byte、char、short、int、long、float、double (3)每个基本数据类型都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,597
精华内容 30,638
关键字:

为什么不能创建泛型数组