泛型理解

来源:互联网 发布:小程序cms系统 编辑:程序博客网 时间:2024/06/07 14:39

泛型:本质是实现参数化类型,就是所操作的数据类型被指定为一个参数。

 

使用:类型<标记符> 其中类型<标记符>类型的泛型类型,标记符称为类型变量或类型参数,类型称为原始类型。

Vertor<E>  Vertor<E>Vertor的泛型类型   E称为类型变量或类型参数  Vertor称为原始类型  

 

标记符意义

E - Element (多在集合中使用,因为集合中存放的是元素)

 -TypeJava类)代表某一类型

 - Key(键)

 -Value(值)

 -Number(数值类型)

 表示不确定的java类型

 

 

特性

1.参数化类型与原始类型的兼容性

参数化类型对象可以被赋值为原始类型的对象

原始类型对象也可以被赋值为参数化类型对象

2.参数化类型无继承性

对于同一原始类型的两个属于继承关系的泛型类型声明的对象不能赋值。

Vector<String> vector=new Vector(””);

Vector<Object> v1=v;//这是错误的。

3.泛型的”去类型”特性

去类型就是指泛型中的类型只是提供给编译器使用,当程序编译成功后就会去掉“类型“信息,即编译成功后就没有泛型类型的限制了。

通过反射机制我们可以在某一泛型类集合,添加非本泛型集合类型变量的对象。泛型

例:

public classShow {

         privatestatic ArrayList<Integer> list;

         publicstatic void main(String[] args) {

                   list=newArrayList<>();

                   list.add(0);

                   try{

                            list.getClass().getMethod("add",Object.class).invoke(list, "abc");

                   }catch (IllegalAccessException | IllegalArgumentException

                                     |InvocationTargetException | NoSuchMethodException

                                     |SecurityException e) {

                            e.printStackTrace();

                   }

                   for(int i = 0; i < list.size(); i++) {

                            System.out.println(list.get(i));

                   }

                  

         }

}

结果

0

abc

 

使用时遇到的问题:

http://www.cnblogs.com/MOBIN/p/4773603.html

4.通配符

使类型参数可以任意化,像集合中可以添加任意类型的对象。

实现方式一定义类型参数为Object

实现方式二:定义类型参数为?本方式只有被调用使用的时候才会知道具体类型。本方式不能对添加修改。

方式二例

publicclass ShowTwo {

privatestatic ArrayList<String> list;

privatestatic ArrayList<Integer> intList;

         public static void main(String[] args){

                   list=new ArrayList<>();

                   list.add("fff");

                   intList=new ArrayList<>();

                   intList.add(5);

                   showData(list);

                   showData(intList);

         }

        

         private static <>voidshowData(ArrayList<> list){

//               list.add("ff");//这是错误的不可以操作。并不确定是什么类型的。

                   for (int i = 0; i < list.size();i++) {

                            System.out.println(list.get(i));

                   }

         }

}