首页 > 编程语言 >JAVA基础--泛型

JAVA基础--泛型

时间:2023-02-04 17:22:45浏览次数:33  
标签:JAVA -- 数据类型 类型 泛型 return 方法 public

JAVA基础--泛型

一、作用

  • 泛化、参数化类型。所操作的数据类型被指定为一个参数;
  • 类型安全。编译时验证类型,如果编译时正常,运行时就不会出现ClassCastException(类型转换异常) 异常;
  • 消除强制类型转换。泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。

二、泛型的声明

格式:<T>
标识符一般使用单个大写字母,常用 T ,含有Type的意思;
包含多个参数类型时,可以用逗号隔开;例如:<K,V>

三、泛型类

定义

class 类名 <T,R...>{

}
  • 类中的普通成员、方法可以使用类的泛型
  • 静态成员、方法无法使用类的泛型。因为类加载时,对象还未初始化,无法确定泛型的具体类型;
  • 泛型类的类型在对象初始化时确定;
  • 对象初始化时未指定类型,默认类型为Object;

例:

public class GenericsTest<T> {

	private T member;
	// 该方法为普通方法,这里的 T 为返回值类型,具体的数据类型在对象创建的时候定义
	public T getValue(List<T> a){
		return a.get(0);
	}
}

四、泛型接口

定义

interface 接口名 <T,R......>{

}
  • 泛型接口类的泛型类型,在继承接口或实现接口时确定
  • 其他特性与泛型类相同
interface GenericsTest<T> {

	T value;
	// 该方法为普通方法,这里的 T 为返回值类型,具体的数据类型在对象创建的时候定义
	T getValue();
}
// 继承
interface StingTest extends  GenericsTest<String>{
	
}

// 实现
class StringClass implements GenericsTest<String>{
	private String value;
	@Override
	public String getValue(){
		return this.value;
	}
}

五、泛型方法

修饰符<T,R...> 返回类型 方法名(参数列表) {

}
  • 普通类或泛型类中都可以定义泛型方法
  • 当泛型方法调用时类型会被确定
  • 注意区分普通方法和泛型方法的区别,泛型访问有泛型声明 <T>
public class GenericsTest<T> {

    // 该方法为普通方法,这里的 T 为返回值类型,具体的数据类型在对象创建的时候定义
    public T getValue(List<T> a){
        return a.get(0);
    }

    // 静态属性和静态方法不能直接使用类的泛型作为参数类型,类加载时对象还没定义,无法确定T代表的具体数据类型
//    public static T getValue1(List<T> a){
//        return a.get(0);
//    }

    // 该方法声明了<T> , 是泛型方法,即使是静态方法也可以使用
    public static <T> T getValue2(T a){
        return a;
    }

    // 方法中使用 非类声明的泛型类型 时,需要另外声明。 如方法:getValue4
//    public E getValue3(List<E> a){
//        return a.get(0);
//    }

    // 声明了 方法 返回的泛型<E>
    public static <E> E getValue4(List<E> a){
        return a.get(0);
    }
}

六、类型通配符 "?"

  • <?>:支持任意泛型类型

  • <? extends A>:支持A类以及A类的子类,规定了泛型的上限

  • <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

标签:JAVA,--,数据类型,类型,泛型,return,方法,public
From: https://www.cnblogs.com/code-tong/p/17091992.html

相关文章

  • python基础:文件内光标移动案例(了解)、计算机硬盘修改数据的原理(了解,为了文件内容修改作
    目录一、文件内光标移动案例(了解)二、计算机硬盘修改数据的原理(了解,为了文件内容修改作解释)三、文件内容修改四、函数1、概念讲解2、语法结构3、函数的定义与调用4、函数的......
  • 我为什么要放弃RESTful,选择拥抱GraphQL
    背景REST作为一种现代网络应用非常流行的软件架构风格,自从RoyFielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广......
  • HFSS 报错汇总
    多层pcb,背地共面波导微带线:建模时如下结构:Top+diel1+diel2+diel3+diel4+diel5,参考层都应该在diel内部,否则会出现如下报错:[warning]Portrefinement,process......
  • 修改表时先删除后添加思想-cnblog
    4.3.2修改菜品信息4.3.2.1代码实现点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端。在修改菜品信息时需要注意,除了要更新dish菜品表,还需......
  • 线程变量-cnblog
    1.3.2ThreadLocalThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程......
  • spring-data-redis-cnblog
    5.3SpringDataRedis5.3.1介绍SpringDataRedis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问Redis服务,对Redis底层开发包进行了高度封装......
  • number类型id和String类型id处理-cnblog
    4.4功能测试代码编写完毕之后,我们需要将工程重启。然后访问前端页面,进行"启用"或"禁用"的测试。测试过程中没有报错,但是功能并没有实现,查看数据库中的数据也没有......
  • PyQt加载UI文件
    1.动态加载importsysfromPySide6importQtCore,QtWidgetsfromPySide6.QtWidgetsimport*fromPySide6.QtUiToolsimportQUiLoaderclassreadfile(QWidget):......
  • spring boot集成mybatis-plus——Mybatis Plus 分页查询数据(图解)
    MybatisPlus分页查询数据(图解) 更新时间2023-01-0111:58:32大家好,我是小哈。本小节中,我们将学习如何通过MybatisPlus分页查询数据库表中的数据。什么是分页查......
  • [数据结构] 树、二叉树、森林的转换
    树树的表示方法双亲表示法用一组地址连续的存储单元来存放树中的各个节点,每一个节点中有一个数据域和一个指针域,数据域用来存储树中该节点本身的值;另一个指针域用来存储......