Java泛型(龟速更新中)

所有笔记内容基于教材《Java语言程序设计与数据结构(进阶篇)》

 

19.2

  1. <T>表示形式泛型类型,虽然没有明确限制,但一般用大写E或T表示。
  2. 实际使用时,需要泛型实例化,用具体类型替换T。
  3. 泛型的优点是可以在编译时检测出错误,一般是类型不匹配的错误。
  4. 穿插一个之前接口的内容,接口可以用作声明类型,但要求引用对象的类必须实现该接口。例子:
    1 Comparable<Date> c = new Date();

     

  5. 并不是所有地方都需要用到泛型。如ArrayList类中的contains方法,参数是Object。那为什么不用泛型E呢?因为这里并不需要我们严格运行出一个结果,换句话说,用一个非E的obj参数也能顺利运行完该方法,只不过结果为false罢了。这样做是为了适应更多不同的参数而不局限于E。
  6. 泛型类型必须是引用类型。对于基本数据类型,一般用其包装类即可。会有自动装箱和拆箱机制。

 

19.3

  1. 定义泛型类/接口。直接在类名后面加<E>即可。如果有多个参数,需逗号分隔,如:<E1, E2, E3>等。

  2. 类里面的实例方法也可以用到泛型,即返回类型可以是E,参数类型可以是E。
  3. 类里面的实例变量可以用泛型,但是初始化的时候不能用new E()这样的方法,只能在构造方法中获得一个引用。一般如果E是不可变类则问题不大,其他的话可能存在浅复制会出现的问题。
    //Test.java
    public class Test<E>{
        private E a;
    
        public Test(E a) {
            this.a = a;
        }
    
        public void show() {
            System.out.println(a);
        }
    
    }
    //Main.java
    public class Main {
        public static void main(String[] args) {
            Test<Integer> t = new Test<Integer>(6);
            t.show();    //6
        }
    }

     

  4. 泛型类的构造方法和普通类的一样,应该定义为:
    public GenericStack()

    没有<E>

  5. 创建泛型类实例,如:new GenericStack<String>()。注意泛型类如果有多个参数,则需全部实例化,不能缺省。
  6. 泛型类可被继承;泛型接口可被实现。继承者/实现者本身也可以是一个泛型类。

 

posted @ 2019-10-06 07:57  末夏始秋  阅读(109)  评论(0编辑  收藏  举报