泛型使用

作者: 风吹稻子 | 来源:发表于2017-03-26 17:28 被阅读22次

如果要针对每种类型的对象写一个数据结构,则当需要将其运用到其他对象上时,还要重写这个数据结构。如果使用了Object这个类型,编写的数据结构虽然通用性很好,但是不能保证传出对象的安全性。从这就可看出,泛型的存在是必要的。

1.为什么使用泛型?

         1.限制保存的元素类型,不需要强制转换。

         2.保证传入对象的安全

代码示例:

        //定义参数类型为T的类:

        public class Stack{

             private LinkedList con = new LinkedList();

             //向栈中添加元素

            public void push(T t){

                   con.addFirst(t);

           }

          //从栈中删除元素

          public T pop(){

                   return con.removeFirst();

            }

             public boolean empty(){

            return con.isEmpty();

          }

    }

测试类:

public class StackTest{

         public static void main(String[] args){

                      //在创建栈时就指明只能保存字符串类型

                      Stack stackStr = new Stack();

                      //在创建栈时就指明只能保存整型

                      Stack stackInt = new Stack();

                      stackStr.push("java好美");

                      stackInt.push(1);

                      while(!stackStr.empty()){

                                System.out.println((String)stackStr.pop());

                       }

                      while(!stackInt.empty()){

                               System.out.println((int)stackInt.pop());

                       }

          }

}

2.泛型化数组

java虚拟机中并没有泛型类型的对象,不支持实例化对象,如T[]array = new T[10];在java中是非法的。那么在自定义数据结构时,我们需要使用泛型数组怎么办?当然是使用反射机制。Array类中的newInstance()方法可以根据指定的类型和长度创建一个数组。

代码:

//定义一个参数类型为T的类

public class A{

          //声明一个类型为T的数组

          private T[] array;

           //用于保存数组长度

           private int size;

            //初始化数组长度和创建泛型数组

             public A(Class type,int size){

                          this.size = size;

                            array = (T[])Array.newInstance(type,size);

               }

}

测试类:

public class TestA{

           pubic static void main(String[] args){

           //创建了一个长度为10,字符串类型的数组

           A a = new A(String.class,10);

            }

}

3.泛型的局限性

          1.不能使用基本类型作为其类型参数,只能是Class

          2.不能抛出或捕获泛型类型的实例

          3.不能直接使用泛型数组

           4.不能实例化类型变量

4.静态泛型方法

在java中不仅可以声明泛型类,也可以在普通类中声明泛型方法,但是要注意以下几点:

          1.使用格式来表示泛型类型参数,参数的个数可以不是一个

           2.类型参数列表要放在访问修饰符、static、和final之后

           3.类型参数要放在返回值类型、方法名称、方法参数之前

例如:

          public static List query(String s,Class type){}

注意:

 在使用泛型类时,不能将泛型参数类用于静态域和静态方法中。而对于静态泛型方法是可以的。这是泛型类与泛型方法的重要区别。因为泛型方法使用已经指明了参数的具体类型。

5.将T限制为某一个类的实现类

         例如:将T限制为实现Comparable接口的实现

                          <T extends Comparable>

6.定义泛型接口

        接口声明如下:

                  public interface Max<T extends Comparable<T>>

          其实现类的声明如下:

                  public class Comparison<T extends Comparable> implements Max<T>

7.使用通配符增强泛型

<? extends Number>表示Byte、Double等都适合这个类型参数

<? super Number>表示类型参数是Number类的父类,如Object

代码:

public class Test {

        //获取中间值

          public static Object getMiddle(List list){

                    return list.get(list.size()/2);

             }

          public static void main(String[] args) {

                 //整型

                     List ints = new ArrayList();

                     ints.add(1);

                     ints.add(2);

                    ints.add(3);

                    //Double类型

                     List doubles = new ArrayList();

                      doubles.add(1.1);

                      doubles.add(2.2);

                      doubles.add(3.3);

                      System.out.println(getMiddle(ints));

                      System.out.println(getMiddle(doubles));

         }

}

8.利用泛型实现折半查找

只需要将int替换成泛型类型T就可以实现更加通用的算法

public class BinSearch190 {

            public static > int search(T[] array,T key){

                    int low = 0;

                    int mid = 0;

                     int high = array.length;

                     while(low<= high){

                             mid = (low+high)/2;

                              System.out.println(mid+"");

                              if(key.compareTo(array[mid])>0){

                                     low = mid+1;

                               } else if(key.compareTo(array[mid])<0){

                                            high = mid - 1;

                               } else {

                                  System.out.println();

                                  return mid;

                               }

                          }

                           return -1;

          }

          public static void main(String[] args) {

                      Integer[] ints = {1,2,3,4,5};

                      System.out.println("元素3所对应的索引号"+search(ints,3));

            }

}

相关文章

  • Java-API-集合框架(三)-泛型

    泛型的由来和基本使用 泛型的擦除 泛型类的使用 泛型方法的使用 泛型接口 泛型通配符(?) 通配符? 在api中的...

  • 夯实JAVA基础之 - 泛型

    泛型的定义及使用 1. 定义泛型: 2. 类中使用泛型 3. 使用泛型类 4. 使用泛型的优势? 多泛型变量的定义...

  • Java 泛型

    一、泛型使用 1、泛型类 2、泛型函数 二、泛型限定符 1、泛型上限 泛型上限使用 extends 限制 多个限制...

  • Objective-C 泛型 协变 逆变

    为什么要使用泛型 如何使用泛型 限制泛型 协变 逆变 为什么要使用泛型 在使用NSArray, NSSet, NS...

  • Java泛型

    本文介绍的知识点 泛型是什么? 泛型的使用在反射中使用泛型在集合类中使用泛型 关于泛型擦除如何理解?如何避免泛型擦...

  • java基础-day13-泛型

    泛型 1. 泛型 1.1 为什么要使用泛型 1.2 泛型的基本格式 1.3 泛型在方法中使用 1.3 泛型在类内的...

  • 第 29 条:优先考虑泛型

    未使用泛型 使用泛型第一种 使用泛型第二种

  • 四 集合 ——第二节 泛型

    文章目录 1、 泛型概念2、 使用泛型的好处3、 泛型的定义与使用 3、1 定义和使用含有泛型的类3、2 含有泛型...

  • 泛型基础二

    如果不明白为什么要使用泛型,使用泛型的好处,以及泛型类,泛型接口,泛型方法等知识,请移步泛型基础一 通配符 上界通...

  • Kotlin 泛型

    Kotlin 泛型 1. 泛型类 定义一个泛型类 使用 在继承中 使用 2. 泛型函数 使用 3. 泛型的擦除 无...

网友评论

    本文标题:泛型使用

    本文链接:https://www.haomeiwen.com/subject/aiykottx.html