• 泛型(Generic)


    1.定义:一种特殊的变量,保存的是引用变量的类型
    2.好处:避免数据类型的转换;将运行时期ClassCastException提前到编译时期
    3.自定义带泛型的类:
         public class A<泛型名>{

        }
         注:类中凡是使用到数据类型的地方,都可以使用泛型名代替;
             泛型名自定义,但是将来使用者只能传递引用数据类型;

      1 代码实现:
      2 //自定义泛型类和泛型方法:
      3 class A<MM>{
      4 	private MM name;
      5 	private int age;
      6 
      7 	public MM getName(){
      8 		return name;
      9 	}
     10 	public void setName(MM name){
     11 		this.name = name;
     12 	}
     13 	public int getAge(){
     14 		return age;
     15 	}
     16 	public void setAge(int age){
     17 		this.age = age;
     18 	}
     19 
     20 	public void say(){
     21 		System.out.println(this.name+"	"+this.age);
     22 	}
     23 
     24 	//定义一个带泛型的方法,传入一个QQ类型的值,返回一个QQ类型的值
     25 	public <QQ> QQ show(QQ m){
     26 		System.out.println(m);
     27 		return m;
     28 	}
     29 }
     30 
     31 public class MmDemo{
     32 	public static void main(String[] args){
     33 		//MM此处开始确定为String类型
     34 		A<String> a = new A<>();
     35 		a.setName("baobao");
     36 		a.setAge(24);
     37 		a.say();
     38 		//带泛型的show方法QQ此处定为String类型
     39 		a.show("xiaobao");//xiaobao
     40 		//带泛型的show方法QQ此处定为int类型
     41 		a.show(123);//123
     42 
     43 		A<String> b = new A<>();
     44 		b.setName("rongrong");
     45 		b.setAge(12);
     46 		b.say();
     47 
     48 	}
     49 }

    4.自定义带泛型的方法:
         public <泛型名>泛型 getName(){
             return name;
         }
    代码:见3.代码实现

    5.自定义带泛型的接口:
         public interface B<泛型名>{

        }
         注:接口中凡是使用到数据类型的地方都可以使用泛型名代替;
    代码实现:

    给泛型赋值的格式有两种形式:
         (1)在定义子类的时候,直接给接口的泛型传递固定的数据类型;
         public class 类名 implements 接口名<具体的数据类型>{
             在类中但凡是使用到数据类型的地方,都可以使用泛型名代替;
         }
         (2)在定义子类的时候也不确定数据类型,在创建子类对象的时候,确定数据类型
         public class 类名<泛型名B> implements 接口名<泛型名B>{
             在类中但凡是使用到数据类型的地方,都可以使用泛型名代替;
         }

      1 //定义一个带泛型的接口
      2 	interface A<W>{
      3 		//带泛型参数的show方法,抽象方法
      4 		public abstract void show(W w);
      5 	}
      6 
      7 	//定义一个实现类--带泛型的实现类
      8 	class BImpl<W> implements A<W>{	//类名后需加上与接口一致的泛型名
      9 		@Override
     10 		public void show(W w){	//重写了带泛型的方法
     11 			System.out.println(w);
     12 		}
     13 
     14 		public static void main(String[] args){
     15 			BImpl<String> b = new BImpl<>();
     16 			b.show("baobao");	//baobao
     17 
     18 			BImpl<Integer> a = new BImpl<>();
     19 			a.show(12345);	//12345
     20 		}
     21 	}

    6.泛型通配符:?
    创建带泛型的类的对象的时候,泛型不能使用多态;只能使用通配符的形式,来达到这样的效果;

    具体的通配符的符号:?  代表任意数据类型
    对通配符的范围进行限定:
         ? extends 具体的数据类型A   此时是限定了上限;A类或A类的子类符合要求,其他数据类型不能传递;
         ? super   具体的数据类型A   此时是限定了下限;A类或A类的父类符合要求,其他数据类型不能传递;

    代码实现:

      1 import java.util.List;
      2 	import java.util.ArrayList;
      3 	//定义一个父类
      4 	class Father{
      5 
      6 	}
      7 
      8 	//定义一个子类
      9 	class Son extends Father{
     10 
     11 	}
     12 
     13 	//定义一个测试类
     14 	public class FsDemo{
     15 		public static void main(String[] args){
     16 			//分别使用Object Father Son作为泛型,定义list集合
     17 			List<Object> Biggest = new ArrayList<>();
     18 			List<Father> Bigger = new ArrayList<>();
     19 			List<Son> Big = new ArrayList<>();
     20 
     21 			//method1(Biggest);//错误: 不兼容的类型: List<Object>无法转换为List<? extends Father>
     22 			method1(Bigger);	//safe extends
     23 			method1(Big);	//safe extends
     24 
     25 			method2(Biggest);	//safe super
     26 			method2(Bigger);	//safe super
     27 			//method2(Big);//错误: 不兼容的类型: List<Son>无法转换为List<? super Father>
     28 
     29 		}
     30 			//定义带泛型的method1方法,上限为Father--? extends Father
     31 			public static void method1(List<? extends Father> list){
     32 				System.out.println("safe extends");
     33 			}
     34 
     35 			//定义带泛型的method2方法,下限为Father--? super Father
     36 			public static void method2(List<? super Father> list){
     37 				System.out.println("safe super");
     38 			}
     39 	}
  • 相关阅读:
    关于书签(BookMark)操作;
    清理内存
    string系列操作1
    SQL临时表
    线程,临界区的研究
    Unix 纪元时间
    shell 模仿验证登陆密码
    delphi字符串中取数字
    delphi MD5加密,BASE64加解密
    delphi sendGetIntmessage、sendStructMessage、sendGetStructMessage和sendTextMessage函数的用法
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7128713.html
Copyright © 2020-2023  润新知