zoukankan      html  css  js  c++  java
  • 泛型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);
        }
    }
  • 相关阅读:
    如何使用Win32API绘制树
    MSD_radix_sort
    Radix Sort
    Computer Science: the Big Picture
    天问之Linux内核中的不明白的地方
    viewController备注
    loadView、viewDidLoad及viewDidUnload的关系(转)
    iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结
    做ios工程时,把UI从xib移动到代码中遇到的问题
    嘟嘟三期的所学所想
  • 原文地址:https://www.cnblogs.com/64Byte/p/12389710.html
Copyright © 2011-2022 走看看