IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JAVA泛型,详细介绍 -> 正文阅读

[Java知识库]JAVA泛型,详细介绍

目录

泛型

泛型的引入

背景:

1.泛型的基本使用

2.泛型方法

3.泛型接口


泛型

泛型的引入

坐标类Point {

?? ?x

?? ?y

}

背景:

?? ?坐标类取值有很多种可能。

?? ?比如:10.1,20.1都是double型

?? ?东经101度,北纬32度 是字符串型

?? ?11,32都是整型

?? ?当x和y不小心设置为不同的类型时,在进行强制类型转换时,就会发生运行时异常(类型转换异常),强转发生的,这个错误是在编译期无法发现的,所以此时泛型应运而生.

1.泛型的基本使用

( 守门员),编译期检查类型是否正确

所谓的泛型指就是在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象时)再进行类型的定义.

public class MyClass<T>{

????T value1;

????T value2;



}

类声明后< >中这个T被称为类型参数,用于指代任意类型,实际上T只是代表,写啥都行

表示此事value1,value2都是在定义时没有明确类型,只有在使用时才告知贬义词类型.

处于规范而言,类型参数用单个的大写字母来代替,常见如下:

T:代表任意类

E:表示Element的意思,或是异常

K:与V搭配使用.Map<Integer,String>

V:

public class MyClass<T>{

????T value1;

????T value2;

????public static void main(String[] args){

????????//创建这个泛型类的时候明确类型微整形

????????MyClass<Integer> myClass = new MyClass<>();

????????myClass.value1 = 10;

???????// myClass.value2 = "123";此时报错语句,因为创建对象时,声明为Integer型





????}

}

如果要定义多种类型

public class MyClass<T, E> {

????T value1;

????E value2;

????public static void main(String[] args) {

????????//创建多个类型

????????MyClass<Integer, String> myClass1 = new MyClass<>();

????????myClass1.value1 = 20;

????????myClass1.value2 = "213"; //此时编译正确

????}

}

我们使用泛型改造Point时会发现,当创建Point对象时设置的类型和实际存储类型不同时,编译就会报错,程序无法启动,提前将问题暴露

泛型不光编译期就会校验类型以外,使用泛型不需要强制类型转换

public class Point<T> {

????private T x;

????private T y;





????public T getX() {

????????return x;

????}





????public void setX(T x) {

????????this.x = x;

????}





????public T getY() {

????????return y;

????}





????public void setY(T y) {

????????this.y = y;

????}





????public static void main(String[] args) {

????????//假设此时都是字符串

????????Point<String> point = new Point<>();

????????point.setX("北纬32");

????????point.setY("东经32");

????????//如果此时不小心输入错误,会有编译错误,而不是在运行时再出错



?? ?? ? //无需强制类型转换

?? ?? ??String x = point.getX();

?? ?? ??String y = point.getY();

????}

}

2.泛型方法

此处泛型方法指的是有自己的类型参数

下边代码中表示此方法是个泛型方法,有一个类型参数<T>不是返回值,只是告知编译器这是一个泛型的声明

void值没有返回值

public class Point<T> {

????private T x;

????private T y;

????//泛型方法

????public <T> void test(T t){

????????System.out.println(t);

????}
}

泛型方法始终以自己的类型参数为准,和类中的类型参数无关(为了避免混淆,一般定义泛型方法时,尽量避免使用类中 使用过的类型参数字母)

完整的泛型方法

<S>表示fun方法是个泛型方法,有一个类型参数S

中间的S表示fun方法的返回值

括号中的S表示方法的形参是S类型

//完整的泛型方法

public <S> S fun(S t){

????System.out.println(t);

????return t;

}

3.泛型接口

//表示该接口是一个泛型接口

public interface INews<T> {

????//返回值

????T get(T t);

}

子类实现此接口时有两种选择,要么继续保留泛型,要么定义子类时明确类型

保留泛型的方式

public class NewsImpl<T> implements INews<T>{

????@Override

????public T get(T t) {

????????return null;

????}

}

明确类型的方式

public class NewsImpl2 implements INews<String>{

????@Override

????public String get(String s) {

????????return null;

????}

}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:22:29  更:2022-03-04 15:26:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:31:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码