泛型Genericity

 泛型:可以在类或方法中预支地使用未知的类型。

注意: 一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

          E - Element            (在集合中使用,因为集合中存放的是元素)   *
T - Type (Java 类)
K - Key (键)
V - Value (值)
N - Number (数值类型)

 

 

 

 

 

 

 

定义泛型:

        编写的类,或者方法上, 灵活性更高, 类操作的数据类型不在由编写者确定, 预知未知的数据类型,

当使用者创建这个类的对象的时候, 由使用者根据他的需求, 确定数据类型不使用Object,

1. 获取数据, 返回的Object类型, 需要进行类型转换,  可能出现ClassCastException

2. 实际中, 集合操作的一组数据, 数据类型都是一样

 

【注意点】
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型
类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化

 

泛型的定义:

1. 在上定义泛型

2. 在方法上定义泛型

3. 在接口上定义泛型

 

类中的泛型

public class GenericDemo1<T>{
   //在类中使用这个泛型变量,    属性的数据类型
   // 返回的返回值,  返回的参数
    //定义一个属性
    private T info; // 属性的数据类型: T的是什么. 数据类型就是什么
    
    //在方法上使用,  使用泛型变量作为返回值类型
    public T  fun1(){
        return info;
    }
    
    //在方法的参数上使用
    public void  fun2(T param){
        System.out.println("我是fun2()方法, 我的参数是:"+param);
    }
}

方法中的泛型

public class GenericDemo2 {
    //在方法上声明泛型
    public <T>  String fun1(T t){
        return "fun1";
    }
    // 静态方法上使用泛型, 声明泛型变量, <E> 写static后面
    public  static <E>   void   fun3(E str){
        
        
    }
//    public void  fun2(T t){   错误
    
//        
//    }
}

接口中的泛型

//泛型接口
public interface GenericInterface<E> {
    
   public void fun1(E e);
}

//实现类一
//实现类,  给接口的泛型变量赋一个数据类型: String
public class GenericInterfaceImpl  implements GenericInterface<String>{

    @Override
    public void fun1(String e) {
        
    }

}

//实现类二
// 子类(子接口) 变成一个泛型类
public class GenericInterfaceImpl2<E> implements GenericInterface<E> {

    @Override
    public void fun1(E e) {
        
    }
    
    public static void main(String[] args) {
        //创建对象:
        GenericInterfaceImpl2<String>  gi = new GenericInterfaceImpl2<>();
        gi.fun1("haha");
        
        
    }

}

 

泛型通配符   ?

public class Genericity_? {
    public static void main(String[] args) {
        
        //使用泛型创建list
        List<String> list=new ArrayList<>();
        list.add("abc");
        list.add("abb");
        list.add("cba");
        
        List<Integer> list1=new ArrayList<>();
        list1.add(123);
        list1.add(234);
        list1.add(456);
        
        
        //调用打印list方法
        printList(list);
        printList(list1);
        
        // 这个方法 接收任意的数据类型元素的 List集合,   有一个警告,  参数List 使用泛型
        //  List<String>  但是list只能接收 元素是String的List集合
        
        // List<Object>  注意: 泛型中,没有继承的关系   List<Object>  list = new ArrayList<String>();   错误
        //  泛型变量
        // ? 代表泛型变量是任意数据类型,  只能接收数据,  不能存储数据
        
        //  限制? 范围        ? extends  类名A   上限          传递的数据类型  A类或者是A类的子类         理解
        //                   ? super    类名A   下限:         传递的数据类型  A类或者A类的父类
        
    }
    
    //打印list方法
    public static void printList(List<?> list){// <? super Number>   <? extends Number>
        System.out.println(list);
    }
}

 

posted @ 2020-03-01 14:30  64Byte  阅读(149)  评论(0编辑  收藏  举报