黑马程序员技术交流社区

标题: 【黑马程序员济南】java基础之泛型 [打印本页]

作者: 小鲁哥哥    时间: 2017-8-29 14:58
标题: 【黑马程序员济南】java基础之泛型
【黑马程序员济南】java基础之泛型

摘要: java基础之泛型这些是黑马程序员java基础入门的一个很重要的内容。今天主要给大家简单讲解一下java基础之泛型,以后会慢慢讲解黑马程序员的课程内容!

一.概述

    1.1 简介

        泛型是java三大高级特性之一,利用JVM的解释器功能,可以让我们的代码应用于多种类型的处理。其核心思想是在newInstance()实例的时候,告诉编译器想使用什么类型,然后编译器帮你处理一切细节。大量框架都是利用了泛型来写通用的处理逻辑,下面简单介绍泛型接口和方法上。

    1.2 擦出特性

        编译器对泛的型处理,java会使将具体的类型信息都擦出啊,你唯一知道的是在使用一个对象。当加入了边界信息<T extends 类>,编译器在编译的时候会将擦出掉类信息,然后将其编译为边界类。

    1.3 总结

        a)泛型相当于一个占位符,编译器自动帮你转化为一个 java.lang.object 的根类。

        b)泛型边界可以让编译将泛型复活转换唯一个边界类型。


        c)为了在泛型类通过反射中操作具体类的各种数据,我们可以使用class<T> t 来创建我们一个实例。这样就可以通过泛型来写通用的类处理框架。

二.实例

   2.1 无边界的泛型使用

[AppleScript] 纯文本查看 复制代码
/**
* @author 传智播客
*/
//接口
// T 相当于一个占位符,在编译器处理时候明确类型
public interface Generator<T> {
        // 在create的时候,编译器知道是哪一个类
        T next();
       
        // 正确泛型方法,在使用这个方法的时候,编译器会从参数组中查询需要的类型
        <S> S create(Class<S> resultObject);
        // 错误泛型方法、在编译器并不知道M这个东西是什么
        // M over();
}
// 类
public class TypeParam<T> implements Generator<T> {

        private T t1;

        @Override
        public T next() {
                return null;
        }

        @Override
        public <S> S create(Class<S> resultObject) {
                return null;
        }

        public T getT1() {
                return t1;
        }

        public void setT1(T t1) {
                this.t1 = t1;
        }

        public static void main(String[] args) {

        }

}


使用 javap -c TypeParam.class

Compiled from "TypeParam.java"
public class typeParam.TypeParam<T> implements typeParam.Generator<T> {
  public typeParam.TypeParam();
    Code:
       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":()V
       4: return

  public T next();
    Code:
       0: aconst_null
       1: areturn

  public <S> S create(java.lang.Class<S>);                                //边界补偿,使用(class<?> xxx )可以明确的在泛型方法中使用反射
    Code:
       0: aconst_null
       1: areturn

  public static void main(java.lang.String[]);
    Code:
       0: return
}
Compiled from "TypeParam.java"
public class typeParam.TypeParam<T> implements typeParam.Generator<T> {
  public typeParam.TypeParam();
    Code:
       0: aload_0
       1: invokespecial #14                 // Method java/lang/Object."<init>":()V
       4: return

  public T next();
    Code:
       0: aconst_null
       1: areturn

  public <S> S create(java.lang.Class<S>);
    Code:
       0: aconst_null
       1: areturn

  public T getT1();
    Code:
       0: aload_0
       1: getfield      #32                 // Field t1:Ljava/lang/Object;        //无边界,将其编译为一个object类型
       4: areturn

  public void setT1(T);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #32                 // Field t1:Ljava/lang/Object;        //无边界,将其编译为一个object类型
       5: return

  public static void main(java.lang.String[]);
    Code:
       0: return
}

    2.2 有边界的泛型使用

[AppleScript] 纯文本查看 复制代码
/**
* @author 传智播客
*/
public class TypeExtends<Q extends String> {
        private Q q;

        Q delete() {
                return q;
        }

        public Q getQ() {
                return q;
        }

        public void setQ(Q q) {
                this.q = q;
        }

}

使用 javap -c TypeExtends.class

Compiled from "TypeExtends.java"
public class typeParam.TypeExtends<Q extends java.lang.String> {
  public typeParam.TypeExtends();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return

  Q delete();
    Code:
       0: aload_0
       1: getfield      #23                 // Field q:Ljava/lang/String;            //有边界,将其编译为边界类型
       4: areturn
}
Compiled from "TypeExtends.java"
public class typeParam.TypeExtends<Q extends java.lang.String> {
  public typeParam.TypeExtends();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return

  Q delete();
    Code:
       0: aload_0
       1: getfield      #23                 // Field q:Ljava/lang/String;        //有边界,将其编译为边界类型
       4: areturn

  public Q getQ();
    Code:
       0: aload_0
       1: getfield      #23                 // Field q:Ljava/lang/String;        //有边界,将其编译为边界类型
       4: areturn

  public void setQ(Q);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #23                 // Field q:Ljava/lang/String;        //有边界,将其编译为边界类型
       5: return
}

    2.3 反射使用

[AppleScript] 纯文本查看 复制代码
/**
* @author 传智播客
*/
public class compansate<T> {
        Class<T> mytypes;

        public T getType() throws InstantiationException, IllegalAccessException {
                return mytypes.newInstance();
        }

        @Test
        public <S> S getType(Class<S> args) throws InstantiationException, IllegalAccessException {
                return args.newInstance();
        }

}

使用 javap -c compansata.class

Compiled from "compansate.java"
public class typeParam.compansate<T> {
  java.lang.Class<T> mytypes;            //通过class来处理类信息

  public typeParam.compansate();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return

  public T getType() throws java.lang.InstantiationException, java.lang.IllegalAccessException;
    Code:
       0: aload_0
       1: getfield      #28                 // Field mytypes:Ljava/lang/Class;
       4: invokevirtual #30                 // Method java/lang/Class.newInstance:()Ljava/lang/Object;
       7: areturn

  public <S> S getType(java.lang.Class<S>) throws java.lang.InstantiationException, java.lang.IllegalAccessException;
    Code:
       0: aload_1
       1: invokevirtual #30                 // Method java/lang/Class.newInstance:()Ljava/lang/Object;
       4: areturn
}

其实在学习java过程中基础还是比较容易,如果大家想学习java基础的知识,欢迎大家可以去传智播客官网去了解java基础知识!








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2