这个Java泛型不太正经

目录
  • 一、前言
  • 二、泛型
  • 三、泛型定义的格式:
    • 什么是引用类型?
    • 泛型的好处是:
  • 四、泛型类
  • 五、泛型方法
  • 六、泛型接口
  • 七、类型通配符
  • 总结

一、前言

泛型在java中有很重要的地位,在实际开发中用处也很大。

二、泛型

泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数

将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数

泛型的类型:

①:泛型类

②:泛型方法

③:泛型接口

三、泛型定义的格式:

<类型> :指定一种类型的格式,这里的类型可以看成是形参。

<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型类型1,类型2可以看成是形参,将来具体调用的时候的参数看成是实参,这里的泛型只能是引用类型

什么是引用类型?

除了八大基本类型其他的都是引用类型,如基本类型对应的包装类

  • boolean -->Boolean
  • char --->Character
  • byte -->Byte
  • short -->Short
  • int -->Integer
  • long -->Long
  • float -->Float
  • double -->Double

泛型的好处是:

  • 把运行得问题提前到编译时期
  • 避免了强制转换

没指定类型默认是Object类型

举个例子,当没有使用泛型时:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class 泛型Demo {
    public static void main(String[] args) {
        //创建一个对象
        Map map=new HashMap();
        //添加数据
        map.put(1, "张三");
        map.put(2, "李四");
        map.put(3,"王五");
        map.put(5, 6);//加了不一样的类型数据

        //键的集合
        Set keySet=map.keySet();
        //键找值
        for(Object key: keySet){
            String value=(String)map.get(key);
            System.out.println(key+":"+value);
        }

    }
}

报了一个类型转换异常(int会自动转化成Integer),Integer不能转为String

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

此时泛型的好处就体现出来了,将运行时会出现的错误拉到了编译期间。

当然也可以在输出是采用Object接收

        //键的集合
        Set keySet=map.keySet();
        //键找值
        for(Object key: keySet){
           Object value=map.get(key);
          //  String value=(String)map.get(key);
            System.out.println(key+":"+value);
        }

这样也可以得到想要的结果。

四、泛型类

泛型类的定义格式:

修饰符 class 类名<类型> { }

举例:

public class Generic<T>{}

这里的T可以使任意标识,常见的如T、E、K、V等形式常用于表示泛型。

泛型类下

public class Generic<T> {
    //定义一个变量,提供get set方法
    private T t;
    public T getT(){
        return t;
    }
    public void SetT(T t){
        this.t=t;
    }

}

测试类下

public class GenericDemo {
    public static void main(String[] args) {
        Generic<String> g1=new Generic<>();
        g1.SetT("章三");
        System.out.println(g1.getT());
        System.out.println("------------------");
        Generic<Integer> g2=new Generic<>();
        g2.SetT(100);
        System.out.println(g2.getT());
    }
}

运行结果

定义这个泛型类的好处就是可以在测试中输入各种你想要的类型。

五、泛型方法

定义泛型方法的格式:

修饰符 <类型> 返回值类型 方法名 (类型 类型名)

举例:

public <T> void show (T t){}

泛型方法

public class Generic {
public <T> void show(T t){
    System.out.println(t);
}
}

泛型方法测试下:

public class GenericDemo {
    public static void main(String[] args) {
       Generic g=new Generic();
       g.show("张三");
       g.show(100);
       g.show(true);
   g.show(null);
    }
}

运行结果

泛型方法比泛型类方便许多,直接在这使用即可,可以用个中类型的参数

六、泛型接口

格式:修饰符 interface 接口名<类型>{}

举例:

public interface Generic&lt;T&gt;{}

既然是接口那就得定义一个类 去实现这个接口

泛型接口:

public interface Generic<T>{}

 GenricImp类下:

public class GenricImp<T> Generic<T>{
   public void show(T t){
     System.out.println(t);
   }

}

 GenricDemo类下:

public class GenricDemo{
   public static void main(String[]args){
        Generic<String> g1=new GenericImp<String>();
       g1.show("张三");
   Generic<Integer> g2=new GenericImp<Integer>();
       g2.show(100);
   }
}

七、类型通配符

<? extends T>上限通配,?表示是T的一个未知子类。

<? super T>下限通配,?表示是T的一个未知父类。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 半小时通透Java的泛型

    目录 前言 学习目标 1. 什么是泛型 2. 为什么需要泛型 3. 如何使用泛型 3.1 泛型使用 3.2 自定义泛型类 3.2.1 Java 源码中泛型的定义 3.2.2 自定义泛型类实例1 3.2.3 自定义泛型类实例2 3.3 自定义泛型方法 4. 泛型类的子类 4.1 明确类型参数变量 4.2 不明确类型参数变量 5. 类型通配符 5.1 无限定通配符 5.2 extends 通配符 5.3 super 通配符 6. 小结 Java 泛型 前言 编程不能停止,每天发一篇~ 不要捉急往后学

  • Java中的泛型

    目录 1. 什么是泛型 2. 为什么需要泛型 3. 如何使用泛型 3.1 泛型使用 3.2 自定义泛型类 3.2.1 Java 源码中泛型的定义 3.2.2 自定义泛型类实例1 3.2.3 自定义泛型类实例2 3.3 自定义泛型方法 4. 泛型类的子类 4.1 明确类型参数变量 4.2 不明确类型参数变量 5. 类型通配符 5.1 无限定通配符 5.2 extends 通配符 5.3 super 通配符 6. 小结 1. 什么是泛型 泛型不只是 Java 语言所特有的特性,泛型是程序设计语言的一

  • Java 泛型详解与范例

    目录 一.泛型的使用 二.泛型类的定义-类型边界 三.类型擦除 四.泛型类的使用-通配符 五.泛型方法 六.泛型的限制 一.泛型的使用 前面我们学集合的时候,简单的说过泛型的使用.如下: ArrayList<Integer> list = new ArrayList<>(); Queue<Integer> queue = new LinkedList<>(); 那么使用是这样的简单,该注意什么? 尖括号里的类型,只能写引用类型 基础数据类型的话,就需要写相应

  • Java中的纸老虎之泛型

    目录 一. 泛型的定义 二. 为什么要用到泛型 三. 泛型的写法 四. 泛型的使用实例 1. 求最大值 2. 优化 五. 通配符 1. 基本写法 2. 上界 3. 下界 六. 泛型的限制 泛型,其实算是Java当中比较难的语法了,很多人一开始都对其一知半解,也很害怕阅读带泛型的源码,虽然看起来语法很难,但当你理解后会觉得很简单,其实只是一个纸老虎罢了.下面,我将会用非常简单易懂的方式带你去理解它,相信你在认真看完后会有非常大的收获,从此不会再畏惧它! 一. 泛型的定义 这里大家可以不必去看网上的

  • Java:泛型知识知多少

    目录 定义 意义(即为什么要使用泛型) 1. 背景 2. 问题 3. 解决方案 作用 原理 额外说明: List能否转为List? 总结 定义 可理解为 适配广泛的类型,即参数化类型,可以把类型像方法的参数那样进行传递. // 以ArrayList为示例 // 泛型T可以是任意类 public class ArrayList<T> { private T[] array; //... } // 通过泛型的使用,就可创建多种类型的ArrayList // 1. 可存储String的ArrayLi

  • 这个Java泛型不太正经

    目录 一.前言 二.泛型 三.泛型定义的格式: 什么是引用类型? 泛型的好处是: 四.泛型类 五.泛型方法 六.泛型接口 七.类型通配符 总结 一.前言 泛型在java中有很重要的地位,在实际开发中用处也很大. 二.泛型 泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数 将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数 泛型的类型: ①:泛型类 ②:泛型方法 ③:泛

  • Java泛型映射不同的值类型详解及实例代码

    Java泛型映射不同的值类型详解 前言: 一般来说,开发人员偶尔会遇到这样的情形: 在一个特定容器中映射任意类型的值.然而Java 集合API只提供了参数化的容器.这限制了类型安全地使用HashMap,如单一的值类型.但如果想混合苹果和梨,该怎样做呢? 幸运的是,有一个简单的设计模式允许使用Java泛型映射不同的值类型,Joshua Bloch在其<Effective Java>(第二版,第29项)中将其描述为类型安全的异构容器(typesafe hetereogeneous Containe

  • Java 泛型总结(三):通配符的使用

    简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用. 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符之前,先来了解一下数组.Java 中的数组是协变的,什么意思?看下面的例子: class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} class

  • java 泛型的详解及实例

    java 泛型的详解及实例 Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码: public class TestGeneric { public static void main(String[] args) { List list = new ArrayList(); list.add(" name:"); list.add(" zer

  • 精通Java泛型的使用与原理

    目录 泛型之前 通过继承设计通用程序 泛型 Java泛型的实现原理 原始类型 突破泛型约束 泛型方法的类型推断 正确的运转 泛型相关问题 1.泛型类型引用传递问题 2.泛型类型变量不能是基本数据类型 3.运行时类型查询 4.泛型在静态方法和静态类中的问题 泛型相关面试题 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 2.Java的泛型是如何工作的 ? 什么是类型擦除 ? 3. 什么是泛型中的限定通配符和非限定通配符 ? 4. List<? extends T>和List <?

  • Java泛型T,E,K,V,N,?与Object区别和含义

    目录 什么是泛型 泛型方法 语法规则 泛型标记符 泛型类 类型通配符 ? ?extendsT ?superT T和? T和Object 总结 通常我们在看一些源码时,发现全是T.?,晕乎乎的:sob:.于是,把泛型掌握好十分重要! 什么是泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 泛型有什么好处?写个例子一目了然: 我

  • java泛型学习示例

    Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter).声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到.其中的优点不言而喻,我们可以横向扩展更多的类,缺点呢,其实也就是他的优点,因为这需要我们在使用泛型类的时候,要很清楚自己的代码目地,不能使用错误的类型. 最基本的泛型类 复制代码 代码如下: package com.garinzhang.jav

  • 浅谈Java泛型让声明方法返回子类型的方法

    泛型典型的使用场景是集合.考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦.本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题. 声明方法返回子类型 在Spring Security的源码里有一个ProviderManagerBuilder接口,声明如下 public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> ext

  • 应用Java泛型和反射导出CSV文件的方法

    本文实例讲述了应用Java泛型和反射导出CSV文件的方法.分享给大家供大家参考.具体如下: 项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. 复制代码 代码如下: public <T> void saveFile(List<T> list, String outFile) throws IOException {         if (list == null || list.isEmpty())

  • 浅谈Java泛型通配符解决了泛型的许多诟病(如不能重载)

    泛型: package Java基础增强; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class Test2 { @Test public void fun1(){ Object[] objects = new Object[10]; List list = new ArrayList(); String[] strings = new String[10]; List<Str

随机推荐