让知识连接你我
投稿赚钱
当前位置: 首页 > 后端开发 > 好程序员Java学习路线分享java为什么不支持泛型数组
  • 101
  • 微信分享

    扫一扫,在手机上查看

好程序员Java学习路线分享java为什么不支持泛型数组

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

  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出现异常。

  我们再用泛型的方式来重写看一遍上面的编码,以下

1568103914440152.png

  编译环境会提醒有误,编译都不成功,因此这便在编译环节就避免了这些风险的产生。泛型能够 确保类型的统一性。

  为什么不可以构建泛型数组?

  这跟数组的一个特性有关,看编码

  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]; // 实际这句是不能通过编译的,会提示错误
      Object[] oj = p;
      }
  }

  假如准许构建泛型数组,将能在数组p里储存任何类的对象,而且能够 通过编译,因为在编译环节p被指出是一个Object[ ],也就是p里边能够 放一个int,也能放一个Pair,当我们拿出里边的int,并强制转换为Pair,启用它的info()时会如何?

  java.lang.ClassCastException!这就违反了泛型加入的基本原则。因此,Java不准许构建泛型数组。

  有人将会会说,即便我用泛型ArrayList list=new ArrayList( ),我不是仍然能够 拿出里边的对象,采用显式的强制类型转换吗?比如,Father f=(Father)list.get(0),具体操作你将会发现,你依旧会被提醒有误,编译不过,这并不是违反泛型加入的基本原则。


本文首次发布于开创者素材 ,转载请注明出处,谢谢合作!

相关文章推荐