Java中的泛型

这篇具有很好参考价值的文章主要介绍了Java中的泛型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是泛型

定义类、接口、方法时,同时声明了一个或者多个类型变量(如:),称为泛型类、泛型接口,泛型方法、它们统称为泛型。

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力。这样可以避免强制类型转换,及其可能出现的异常。

泛型的本质:把具体的数据类型作为参数传给类变量。

自定义泛型类
自定义泛型接口
自定义泛型方法

泛型类

Java中的泛型,Java学习路线,java,开发语言
eg. 模拟ArrayList类

//泛型类
//这里的E,使用A、B、C都是一样的,一般使用E、T、K、V
public class MyArrayList<E> {
	private Object[] arr = new Object[10];
	private int size; //记录当前位置的
	public boolean add(E e) {
		arr[size++] = e;
		return true;
	}
	public E get(int index) {
		return (E) arr[index];
	}
	
}
//泛型类
//这里的E,使用A、B、C都是一样的,一般使用E、T、K、V
public class MyClass<E, T> {
	public void put(E e, T t) {

	}
}
//泛型类3
//在使用时这里的E必须要是继承Animal类的类才可以放进来
//泛型类可以通过extends的方式来限制放入的类型变量
public class MyClass3<E extends Animal> {
	
}

public class Dog extends Animal {
}
//会报错,因为String类型没有继承Animal
MyClass3<String> c3 = new MyClass();
//正确,可以放入Animal本身
MyClass3<Animal> c3 = new MyClass();
//正确,因为Dog继承了animal
MyClass3<Dog> c3 = new MyClass();

泛型接口

Java中的泛型,Java学习路线,java,开发语言
eg.
场景:系统需要处理学生和老师的数据,需要提供2个功能:
保存对象数据,
根据名称查询数据。

//老师类
public class Teacher {
}
//学生类
public class Student {
}
//泛型接口
public interface Data<T> {
	void add(T t);
	ArrayList<T> getByName(String name);
}

//实现类
public class TeacherData implements Data<Teacher> {
	@Override
	public void add(Teacher teacher) {
	}
	@Override
	public ArrayList<Teacher> getByName(String name) {
		return null;
	}
}

//实现类
public class StudentData implements Data<Student> {
	@Override
	public void add(Student student) {
	}
	@Override
	public ArrayList<Student> getByName(String name) {
		return null;
	}
}

public class Test {
	public static void main(String[] args)
}

泛型方法

Java中的泛型,Java学习路线,java,开发语言
Java中的泛型,Java学习路线,java,开发语言

通配符

  • 就是“?“,可以在“使用泛型“的时候代表一切类型;E T K V 是在定义泛型的时候使用。

泛型的上下限

  • ? extends Car(上限) ?能接收的必须是Car或Car的子类
  • ? super Car(下限) ?能接收的必须是Car或Car的父类
public static <T> T test(T t) {
	return t;
}
//正确
test(new Dog());
test("java");

eg
需求: 所有的汽车可以一起参加比赛

public class Car {
}

public class BMW extends Car {
}

public class BENZ extends Car {
}

public static void go(ArrayList<Car> cars) {

}

ArrayList<Car> cars = new ArrayList<>();
cars.add(new BMw());
cars.add(new BENZ());
go (cars);

ArrayList<BMW> bmws = new ArrayList<>();
//加入两辆宝马车
bmws.add(new BMW());
bmws.add(new BMW());
//会报错,重点:Car是父类,但ArrayList的Car和ArrayList的BMW是没有关系的
go(bmws);

解决方法

//这样所有类型的ArrayList都可以送进来
public static <T> void go(ArrayList<T> cars) {
}
//仅限定汽车能进来
public static <T extends Car> void go(ArrayList<T> cars) {
}
//ArrayList本身就是泛型,?是通配符,在使用泛型时可以代表一切类型
public static void go(ArrayList<?> cars) {
}
//加入限定
// ? extends Car(上限) 必须是Car或Car的子类
// ? super Car(下限) 必须是Car或Car的父类
//此时可以送入的类型是Car以及Car的子类
public static void go(ArrayList<? extends Car> cars) {
}

泛型的注意事项

擦除问题

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型类,这就是泛型擦除

Java中的泛型,Java学习路线,java,开发语言
class底层中帮你强转类型

基本数据类型问题

  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)

引用类型都是Object的子类,而基本类型不是类。文章来源地址https://www.toymoban.com/news/detail-788607.html

到了这里,关于Java中的泛型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java的泛型【详解】

    定义类、接口、方法时,同时声明了一个或者多个类型变量(如:E) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。 1.泛型类:

    2024年02月19日
    浏览(41)
  • Java的泛型详解

    Java泛型是一种编程语言的特性,它允许类、接口和方法在定义时使用一个或多个类型参数,这些类型参数在调用时会被实际类型替换,从而增强了代码的重用性和类型安全性。通过使用泛型,我们可以编写出更加通用的代码,同时也可以减少代码中的强制类型转换操作,提高

    2024年02月04日
    浏览(39)
  • Java的泛型

    泛型是我们需要的程序设计手段。使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。 至少在表面上看来,泛型很像 C++ 中的模板。与 Java —样,在 C++ 中,模板也是最先被添加到语言中支持强类型集合的

    2024年02月08日
    浏览(39)
  • 【Java】十年老司机转开发语言,新小白从学习路线图开始

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月17日
    浏览(48)
  • TypeScript中的泛型(泛型函数、接口、类、泛型约束)

    一、泛型函数 TypeScript 泛型是一种可以使代码具有更高的可重用性和泛化能力的特性 。通过泛型,我们可以定义一种通用的类型或函数,使其能够应对多种类型的输入。泛型在类、函数、接口等多种场景下都可以使用。 具体来说,在定义泛型函数时,我们可以使用来表示一

    2024年02月11日
    浏览(44)
  • 【TypeScript】TypeScript中的泛型

    定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。 举个例子: 上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的,由于类型不确定所以参数和

    2024年02月09日
    浏览(46)
  • C++中的泛型详细讲解

    它是一种泛化的编程方式,其实现原理为程序员编写一个函数/类的代码示例,让编译器去填补出不同的函数实现。允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或

    2024年02月12日
    浏览(51)
  • Kotlin中的泛型理解与应用

    泛型是一种在编程中用于增加代码的灵活性和重用性的概念。它允许我们编写可以在多种类型上工作的通用代码,而不需要为每种类型都编写不同的代码。 在Kotlin中,泛型可以应用于类、函数和接口等。下面是一些关于泛型在Kotlin中的理解和示例。 1、泛型类 泛型类是指可以

    2024年02月07日
    浏览(36)
  • python中的泛型使用TypeVar

    PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分。通过精巧的元编程技术,让类支持[]运算不成问题。但是方括号内的T变量必须在某处定义,否则要大范围改动python解释器才能让泛型支持特殊的[]表示法。 鉴于此,我们增加了typing.TypeVar构造函数,把变量

    2024年02月04日
    浏览(49)
  • 【Rust 基础篇】Rust 中的泛型:结构体和方法

    在 Rust 中,泛型是一种强大的特性,可以在结构体和方法中使用通用的类型参数。通过泛型,我们可以编写更加灵活和可复用的代码。本篇博客将详细介绍如何在 Rust 的结构体和方法中使用泛型,包括泛型结构体的定义、泛型方法的实现以及对泛型参数的约束。 在 Rust 中,我

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包