java的泛型基础入门

1.泛型的作用

防止随意的放置任何的对象,使用泛型后只能按我们使用时指定的类型添加以及会相应的进行编译时检查,在编译检查后会去除相应的泛型信息(运行时没有这个信息了),在类型转换的也会自动的相应的转换为相应的信息

public class GenenricyDemo1 {
    public  static <T> T test1(T t){
        return t;
    }

    public  <T>  T test2(T t){
        return t;
    }

    public static void main(String[] args) {
        String test1 = GenenricyDemo1.test1("a");
        String test2 = new GenenricyDemo1().test2("b");
    }

}

2.泛型的编译时类型检查(泛型是没有多态。直接比较放入类的class文件,但是在数组中是可以有多态的)

public class GenericyDemo2 {
  public static void main(String[] args) {
     // ArrayList<Object> arrayList = new  ArrayList<String>();//编译时错误
        ArrayList<String> arrayList = new  ArrayList<>();//编译时正常
        ArrayList arrayList1 = new  ArrayList<String>();//编译时正常
        ArrayList<Object> arrayList2=arrayList1 ;//编译时正常,编译时一行一行检查的
     // arrayList2=arrayList;//编译时错误   //Vector<String > []  vct=new Vector<String >[10]; //编译错误,参数化类型没有数组的表达形式   //ArrayList<int> str=null;//编译错误,泛型参数只能对对象不能是基本类型的数据,不会自动包装   Object []  objs= new  String [10];//编译时通过   interface  GenericyDemo9Iface<GenericyDemo>{//? extends GenericyDemo9Fater是不能使用的(类 接口等)
  }
}

3.继承实现泛型

@SuppressWarnings("all")
public class GenericyDemo3<B, A, C> extends GenericyDemo3Father<A> implements GenericyDemo3Iface<B> {
    private static final String ParameterizedType = null;
    private C c;

    @Override
    public String test(B t) {
        return t.toString();
    }

    private <T> T test3(T t) {
        return t;
    }

    public static void main(String[] args) {
        Type[] genericInterfaces = GenericyDemo3.class.getGenericInterfaces();
        System.out.println(genericInterfaces[0]);
        Type superclass = GenericyDemo3.class.getGenericSuperclass();
        if (superclass instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) superclass).getActualTypeArguments();
            System.out.println(actualTypeArguments[0]);
        }
        GenericyDemo3 genericyDemo3 = new GenericyDemo3();
        try {
            Method[] methods = genericyDemo3.getClass().getDeclaredMethods();
            for (Method method : methods) {
                if (method.getName().equals("test3")) {
                    method.setAccessible(true);
                    Object invoke = method.invoke(genericyDemo3, "String");
                    if (invoke.getClass() == String.class) {
                        System.out.println(invoke);// 有输出String
                        // 因为我们获取的字节码文件还是自己本身
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

interface GenericyDemo3Iface<T> {
    public String test(T t);
}

class GenericyDemo3Father<T> {
    public String test1(T t) {
        return t.toString();
    }
}

4.泛型不写与书写Obejct的区别

public class GenericyDemo4 {
    //不写泛型默认为Object,编译时不会进行类型检查
    //写泛型为Object,编译时不会进行类型检查
    public static void main(String[] args) {
        ArrayList arrayList = new  ArrayList();
        arrayList.add("a");
        arrayList.add(1);
        ArrayList<Object> arrayList1= new  ArrayList<>();
        arrayList1.add("a");
        arrayList1.add(1);
    }
}

5.获取泛型的类型

public class GenericyDemo5 {
    public static void main(String[] args) throws Exception {
        Method[] methods = GenericyDemo5Test.class.getMethods();
        for (Method method : methods) {
            if (method.getName().equals("test")) {
                Type[] parameterTypes = method.getGenericParameterTypes();
                System.out.println(parameterTypes[0]);
            }
        }
    }
}

class GenericyDemo5Test {
    public Vector<String> test(Vector<String> Str) {

        return null;
    }
}

6.泛型的拭除

public class GenericyDemo6 {
   public static void main(String[] args) {
      ArrayList<String> arrayList = new ArrayList<>();
      ArrayList<Integer> arrayList1 = new ArrayList<>();
      System.out.println(arrayList.getClass()==arrayList1.getClass());//true
}
}

7.通配符的特征:

  1)可以用于声明类型和声明方法的参数上,实例化时需指定,不可以用于声明类的参数上;

  2)?只能输入和输出,不能修改;

  3)? extends  上限  (继承或者实现关系);

  4)? super   下限   (继承或者实现关系,可以是下限或者是下限的子类);

public class GenericyDemo7 {
    public static void main(String[] args) {
        ArrayList<? super List<String>> arrayList1 = new ArrayList<>();
        arrayList1.add(new ArrayList<>());//不能添加new Object(); 原因前面已经说明
    }
}
public class GenericyDemo7 {
    public static void main(String[] args) {
            ArrayList<? extends GenericyDemo7Iface> list1 = new  ArrayList<>();
            ArrayList<GenericyDemo7Son> list2 = new  ArrayList<>();
            list2.add(new GenericyDemo7Son());
            list1=list2;
            System.out.println(list1.get(0));
            //list1.add(new GenericyDemo7Son());//编译错误,只能添加null值
    }
}

class GenericyDemo7Son  implements GenericyDemo7Iface {

}

interface GenericyDemo7Iface {

}

原文地址:https://www.cnblogs.com/gg128/p/9315585.html

时间: 2024-11-08 23:36:17

java的泛型基础入门的相关文章

java的反射基础入门

1.获取反射Class类的方式 Class.forName("全类名"): 类名.class//需要在JVM已加载的前提下 对象.getClass 2.java对javabean进行操作的四种方式 public class Descriptor { public static void main(String[] args) throws Exception { // 方式1 PropertyDescriptor descriptor = new PropertyDescriptor(

Java 之 Servlet 基础入门

Servlet 一.什么是 Servlet 1.概念 Servlet:server applet,是指运行在服务器端的小程序 2.Servlet   servlet 就是一个接口,定义了 Java 类被浏览器访问到(tomcat识别)的规则.   二.Servlet 执行原理 1.入门案例 (1)创建 JavaEE 项目 (2)定义一个类,实现 Servlet 接口 public class ServletDemo1 implements Servlet (3)实现接口中的抽象方法 1 impo

java的注解基础入门

1.常用的注解 @overrive继承//继承的方法时建议都添加该注解,防止我们不是重写方法 @deprecated  废弃的方法 @suppresswarning  警告信息,属性值all表示所有的意思 2.元注解 @target描述注解使用的范围 说明 @target(value=ElementType.值) 属性值: Package  使用范围包 Type     使用范围类接口枚举annotation类型 Constructor   使用范围构造器 Field   使用范围属性 Meth

java网络爬虫基础学习(一)

刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网下载网页,是搜索引擎的重要组成部分. 传统爬虫: 获得URL ->放入队列 ->抓取网页,分析信息 ->新的URL ->放入队列 ->抓取网页,分析信息... ->满足一定条件,停止. 聚焦爬虫: 根据一定的网页分析算法过滤与主题无关的链接

[.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 &amp; 大型控件的ImageField)

[.ashx檔?泛型处理程序?]基础入门#5....ADO.NET 与 将DB里面的二进制图片还原 (范例下载 & 大型控件的ImageField) http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/19/ashx_beginner_05_db_picture_show_download.aspx 根据前面三篇文章的教学 完成后可以做出来  (请您务必依照顺序学习,不要只是找范例来Copy) [.ashx檔?泛型处理程序?]基础入门#1.

java之 ------ 泛型【从基础到加强】

泛型 基础篇 一.为什么要泛型 1.原因 先看一个集合的例子(至于集合,前面有讲解,集合详解链接,不懂得可以先去看看那篇) import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import cn.hncu.bean.Person; public class CollectionDemo { public static void m

一个小栗子聊聊JAVA泛型基础

背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码谨慎的打日志来解决,我们今天主要来一起回顾下JAVA泛型基础. 一个小栗子 先看下面一个例子,test1实例化一个List容器的时候没有指定泛型参数,那么我们可以往这个容器里面放入任何类型的对象,这样是不是很爽?但是当我们从容器中取出容器中的对象的时候我们必须小心翼翼,因为容器中的对象具有运行时的类

Java基础入门 传智播客pdf

下载地址:网盘下载 内容简介 <Java基础入门>从初学者的角度详细讲解了Java开发中重点用到的多种技术.全书共11章,包括Java开发环境的搭建及其运行机制.基本语法.面向对象的思想,采用典型翔实的例子.通俗易懂的语言阐述面向对象中的抽象概念.在多线程.常用API.集合.IO.GUI.网络编程章节中,通过剖析案例.分析代码结构含义.解决常见问题等方式,帮助初学者培养良好的编程习惯.最后,讲解了Eclipse开发工具,帮助初学者熟悉开发工具的使用.  <Java基础入门>附有配套

零基础入门学习java,应该如何快速打好Java基础?

零基础入门学习java,应该如何快速打好Java基础?从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用. 创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学java能够持之以恒java爱好群,如果你想要学好java最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:快乐学习java组织