zoukankan      html  css  js  c++  java
  • 泛型编程

    泛型编程

    泛型是java1.5引入的新特性,把明确的数据类型的工作放在创建对象或调用方法时进行,提供了编译时类型安全检测机制

    泛型类

    class Pair<T>{
    	T min;
    	T max;
    	public Pair(T min2, T max2) {
    		max = max2;
    		min = min2;
    	}
    	public T getMax(){
    		return max;
    	}
    	public T getMin(){
    		return min;
    	}
    }
    

    泛型方法

    • :限定类型变量实现了Comparable接口
    • 泛型方法可以定义在普通类中,也可以定义在泛型类中
    class ArrayAlg1{
    	//限定类型变量实现了Comparable接口
    	//这里extends继承接口,多个接口&分隔
    	public static <T extends Comparable>Pair<T> minmax(T[] a)
    	{
    		if (a==null||a.length==0)return null;
    		T min = a[0];
    		T max = a[0];
    		for(int j=1;j<a.length;j++){
    			if(min.compareTo(a[j])>0)min = a[j];
    			if(max.compareTo(a[j])<0)max = a[j];
    		}
    		return new Pair(min,max);
    	}
    
    	public static <T> T getMiddle(T... a){
    		T b=a[a.length/2];
    		return b;
    	}
    }
    

    泛型接口

    • 1.定义接口时确定类型
    • 2.创建对象时确定类型
    interface Inter<E>{
    	void show(E e);
    }
    
    // 定义接口时确定类型
    class InterImpl implements Inter<Integer>{
    	@Override
    	public void show(Integer e) {
    		System.out.println(e);
    	}
    }
    
    // 创建对象时确定类型
    class InterImpl2<E> implements Inter<E>{
    	@Override
    	public void show(E e) {
    		System.out.println(e);
    	}
    }
    

    泛型通配符

    通常约定
    ?: 表示不确定的 java 类型
    T : (type) 表示具体的一个java类型
    K/V: (key value) 分别代表java键值中的Key Value
    E : (element) 代表Element

    <? extends T>

    • 如果传入的类型不是 E 或者 E 的子类,编译不成功
    • 类型参数列表中如果有多个类型参数上限,用逗号分开
        private <K extends A, E extends B> E test(K arg1, E arg2){
        E result = arg2;
        arg2.compareTo(arg1);
        //.....
        return result;
        }
    

    <? super T>

    • 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object
       // ArrayList源码foreach接收一个E或E父类类型
       class ArrayList<E> {
        public void forEach(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            final int expectedModCount = modCount;
            @SuppressWarnings("unchecked")
            final E[] elementData = (E[]) this.elementData;
            final int size = this.size;
            for (int i=0; modCount == expectedModCount && i < size; i++) {
                action.accept(elementData[i]);
            }
            if (modCount != expectedModCount) {
                throw new ConcurrentModificationException();
            }
        }
    
  • 相关阅读:
    设计模式之装饰模式
    SpringAOP 失效解决方案、Spring事务失效
    Jmeter测试出现端口占用情况
    ElasticSearch创建动态索引
    Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
    TCP的三次握手与四次挥手笔记
    Java中的阻塞队列
    Jmeter5.1——聚合报告参数分析
    SpringCloud"灰度部署"——动态刷新网关配置
    JVM学习笔记——类加载过程
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/13986968.html
Copyright © 2011-2022 走看看