• java泛型 之 入门(interface)


    一:泛型简单介绍:

    (1)所谓泛型,就是变量类型的參数化。

    泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和执行时更小的抛出ClassCastException的可能。在JDK1.5中,你能够声明一个集合将接收/返回的对象的类型。使用泛型时假设不指明參数类型,即泛型类没有參数化。会提示警告。此时类型为Object。

    (2)为什么使用泛型

    使用泛型的典型样例。是在集合中的泛型使用。假设不使用泛型。存入集合中的元素能够是不论什么类型的,当从集合中取出时,全部的元素都是Object类型。须要进行向下的强制类型转换,转换到特定的类型。

    比方:
    List myIntList = new LinkedList(); // 1
    myIntList.add(new Integer(0)); // 2
    Integer x = (Integer) myIntList.iterator().next(); // 3   
    第三行的这个强制类型转换可能会引起执行时的错误。



    泛型的思想就是由程序猿指定类型。这样集合就仅仅能容纳该类型的元素。
    使用泛型:
    List<Integer> myIntList = new LinkedList<Integer>(); // 1'
    myIntList.add(new Integer(0)); // 2'
    Integer x = myIntList.iterator().next(); // 3'
    将第三行的强制类型转换变为了第一行的List类型说明。编译器会为我们检查类型的正确性。这样,代码的可读性和健壮性也会增强。



    (3)泛型使用基础

    public interface List <E> {
        void add(E x);
        Iterator<E> iterator();
    }

    public interface Iterator<E> {
        E next();
        boolean hasNext();
    }
    尖括号里包括的是形式类型參数(formal type parameters),它们就如同一般的类型一样。能够在整个类的声明中被使用。当类被使用时。会使用详细的实际类型參数(actual type argument)取代。比方前面的样例中的List<Integer>,那么全部的E将会被Integer类型所取代。


    泛型类型參数仅仅能被类或接口类型赋值,不能被原生数据类型赋值。原生数据类型须要使用相应的包装类。

    形式类型參数的命名:尽量使用单个的大写字母(有时候多个泛型类型时会加上数字。比方T1,T2)。比方很多容器集合使用E,代表element(元素)。Map中用K代表键keys,V代表值。

    二 实际应用:

    (1) 创建接口ParentInterface 的java文件

    package edu.tju.cs;
    
    public interface ParentInterface<T1,T2>{
        public void setFoo1(T1 foo1);
        public void setFoo2(T2 foo2);
        public T1 getFoo1();
        public T2 getFoo2();
    
    }
    

    (2) 创建实现类ChildClass的java文件

    package edu.tju.cs;
    
    public class ChildClass<T1,T2> implements ParentInterface<T1, T2>{
        private T1 foo1;
        private T2 foo2;
        
        @Override
        public void setFoo1(T1 foo1){
            this.foo1 = foo1;
            
        }
        @Override
        public void setFoo2(T2 foo2){
            this.foo2 = foo2;
        }
        @Override
        public T1 getFoo1(){
            return this.foo1;
        }
        @Override
        public T2 getFoo2(){
            return this.foo2;
        }
    
        public static void main(String[] args) {
    		ChildClass<String,String> cc = new ChildClass<String,String>();
    		cc.setFoo1("徐勤柱");
    		cc.setFoo2("王昭娴");
    		System.out.println("get() " + cc.getFoo1());
    		System.out.println("get() " + cc.getFoo2());
    		
    		ChildClass<Integer,String> cc2 = new ChildClass<Integer,String>();
    		cc2.setFoo1(123);
    		cc2.setFoo2("吴明静");
    		System.out.println("get() " + cc2.getFoo1());
    		System.out.println("get() " + cc2.getFoo2());
    		
    		ChildClass<String,Number> cc3 = new ChildClass<String,Number>();
    		cc3.setFoo1("申佳维");
    		cc3.setFoo2(123.4556);
    		System.out.println("get() " + cc3.getFoo1());
    		System.out.println("get() " + cc3.getFoo2());
    	}
    }

    三  学习心得:

    (1)java 泛型不能够有基本类型

    List<int> list=new ArrayList<int>();//这里。这样是错误的
    list.add(0);
    list.add(1);
    这是由于:泛形要求能包容的是对象类型,而基本类型在java里不属于对象。可是基本类型都有其包装类型,也就是对象类型:
    int->Integer
    long->Long
    ....
    那么你要想存放基本类型就用其包装类型去实现功能
     List<Integer> list=new ArrayList<Integer>();
    list.add(0);
    list.add(1);

    总之中的一个句话。泛型里面能够放<integer> ,<character>。int,char 基本类型是不能够的。泛型里面是能够放引用类型的,比方放个对象类型。<User>.

    http://docs.oracle.com/javase/tutorial/extra/generics/simple.html

  • 相关阅读:
    使用Stream流递归 组合树形结构
    MySQL 8 通用表表达式
    sa-token 权限认证
    先更新缓存还是先更新数据库?
    钉钉 回调事件 消息加解密
    commons-io
    stream和parallelstream的区别
    消除if...else
    springboot 扩展xml请求和响应
    springboot admin 邮箱
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5151110.html
Copyright © 2020-2023  润新知