基础_泛型

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

1.概述

泛型,即“参数化类型”。
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型只在编译阶段有效,在编译之后程序会采取去泛型化的措施。

2.泛型的使用

  • 泛型类
  • 泛型方法
  • 泛型接口
2.1 泛型类

泛型类型用于类的定义中,被称为泛型类。

格式:
class 类名<泛型参数>
{

}

在这里插入图片描述
说明:
1.在类上定义的泛型,当外界在创建这个类的对象的时候,需要创建者自己来明确当前泛型的具体类型;
2.在类上定义的泛型,在类中的方法上和成员变量是可以使用的;
3.创建类的对象时没有指定泛型类的类型时,那么ABC默认是Object类型;

注意:对于自定义泛型类只有在创建这个类的对象的时候才可以指定泛型的类型。


2.2 泛型方法
在函数上使用泛型的格式:
函数修饰符 <泛型名>  函数返回值类型  方法名( 泛型名 变量名 )
{ 
	函数体;
}

在这里插入图片描述
说明:
1.public 与 返回值/void中间非常重要,可以理解为声明此方法为泛型方法。
2.只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3.表明该方法将使用泛型类型Q,此时才可以在方法中使用泛型类型Q。
4.与泛型类的定义一样,此处Q可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。

注意:
1.方法上的泛型和类上的泛型无关
2.类上的泛型在创建这个类的时候确定,而方法上的泛型在调用这个方法时确定

静态函数上的泛型:
静态函数不能使用类上定义的泛型。
因为静态方法的运行是不需要对象的,而类上的泛型必须在创建这个类对象的时候才能明确具体是什么类型。
而静态函数运行的时候是没有对象的,也就是说类上的泛型在静态函数运行的时候还不知道是什么类型。


2.3 泛型接口
泛型接口的格式:
修饰符 interface 接口名<泛型>{}

什么时候确定泛型的类型呢?有两种方式可以实现。
方式1:类实现接口的时候,直接明确泛型类型。
在这里插入图片描述

方式2:类实现接口的时候,还不确定数据类型,这时可以在实现类上随便先定义个泛型,当这个类被创建对象的时候,就明确了类上的泛型,于是接口上的泛型也明确了。
在这里插入图片描述

2.4 泛型通配符

如果的两个函数以函数重载的形式存在,只有泛型的数据类型不一致,而且都是ArrayList,我们可以简化代码的开发,我们可以只定义一个函数来遍历集合。

所以这里我们只能借助泛型中通配符可以实现 : ?

? 表示泛型的通配符,表示集合中的任意数据类型,传递过来的表示什么数据类型,?就表示什么数据类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,是一种强类机制,它可以让你在编译时检查类错误,从而提高代码的安全性和可读性。在使用时,我们经常会遇到父类和子类的转换问题。 首先,我们需要明确一点:子类不能转换成父类。这是因为Java中的是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类转换成父类,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类转换成父类了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类转换成父类了。 总结一下,Java中的是不协变的,子类不能转换成父类。如果需要实现子类转换成父类,可以使用通配符来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值