java_泛型

2018-06-27 09:47:16来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一.   泛型类的使用

  1.定义类时使用泛型

  class 类名<字母列表>{

     ……
  
  }

  泛型常见字母:T,  K,V  ,E  ?

  不能使用在静态属性.静态方法上

 

 

  2.注意:

  1.泛型使用时不能指定基本类型

  2.使用时指定类型(引用类型,不能使用基本数据类型)

  3. 不能使用在静态属性.静态方法上,静态属性在编译时确定(即不能把字母用在静态属性上)

  4.编译时自动检查泛型

  5.接口中泛型只能用在方法中,不能用在全局常量 (接口只是由全局常量和抽象方法组成)

 

   3.代码示例

    
public class Student<T1,T2> {

   private T1 name;

   private T2 age;

  

  

  

   public Student(T1 name, T2 age) {

      super();

      this.name = name;

      this.age = age;

   }

   public T1 getName() {

      return name;

   }

   public void setName(T1 name) {

      this.name = name;

   }

   public T2 getAge() {

      return age;

   }

   public void setAge(T2 age) {

      this.age = age;

   }

  

   public static void main(String[] args) {

      Student<String,Integer> stu=new Student<String,Integer>("章三",20);

      System.out.println(stu.getName()+stu.getAge());

   }

}
示例代码

 

 

二.   泛型方法

  定义:

    修饰符<字母> 返回类型 方法名(字母){}

  注意:

  1.泛型方法在返回类型前面定义,
  2.在使用时确定对象类型
  3.泛型元素只能访问对象的信息,不能修改,因为不确定对象类型

 

   示例代码: 

  
import java.io.Closeable;

import java.io.IOException;

 

 

public class TestMethod {

   //测试泛型方法

   public static void main(String[] args) {

      test1("abc");

   }

   //test1

   public static <T> void test1(T t){

      System.out.println(t);

   }

   //test2   extends等价于<=

   public static <T extends Closeable> void test2(T... t){

      for(T e:t){

         try {

            e.close();

         } catch (IOException e1) {

            // TODO Auto-generated catch block

            e1.printStackTrace();

         }

      }

   }

}
示例代码

 

 

三.   泛型擦除

  定义

  1.父类为泛型类,子类可以为泛型类,也可以不是泛型类,不是泛型类需要指定子类,子类泛型代表字母和父类要相同
  
2.子类为泛型类,父类不指定类型,称为泛型的擦除.使用object替换
  
3.泛型擦除,要么同时擦除,要么擦除父类,子类的类型大于等于父类,仅仅擦除子类是错误的.
  
4.属性类型(根据位置而定):       父类中:随父类而定,       子类中:随子类而定     方法重写:       随父类而定   5.泛型接口与继承是一样的   6.擦除后,不会进行类型检查

 

 

 

  示例代码:

  
//父类为泛型类

public abstract class Father<T> {

    T name;

   

    abstract <T> void test(T t);

}

//子类不指定类型

class son<T> extends Father<T>{

    T t2;//自己定义的变量

    @Override

    <T> void test(T t) {

       // TODO Auto-generated method stub

    }  

}

//父类为泛型类,子类指定类型

class son1 extends Father<String>{

    @Override

    <T> void test(T t) {

       // TODO Auto-generated method stub

    }

}

//子类为泛型类,父类不指定类型,称为泛型的擦除

class son2<T> extends Father{

    @Override

    void test(Object t) {

       // TODO Auto-generated method stub

    }  

}

//子类父类同时擦除

class son3 extends Father{

    @Override

    void test(Object t) {

       // TODO Auto-generated method stub

      

    }

}

/*//错误:子类擦除,父类没有擦除

class son4 extends Father<T>{

    @Override

    <T> void test(T t) {

       // TODO Auto-generated method stub

      

    }

}*/
示例代码

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:常见简单算法

下一篇:基于SpringMVC+Spring+MyBatis实现秒杀系统【客户端交互】