Java泛型

本文详细介绍了Java泛型的概念、用法,包括泛型类、泛型方法和泛型接口的定义,以及泛型通配符的使用。通过示例展示了如何利用泛型提高代码安全性,避免类型转换带来的问题,同时讲解了泛型通配符在不同场景下的应用。
摘要由CSDN通过智能技术生成

Java泛型


一、泛型

概念

我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成
Object类型。当我们在取出每⼀个对象,并且进⾏相应的操作,这时必须采⽤类型转换。
没有泛型的话,取出来的话,需要向下转型,效率低下。容易产⽣错误。
泛型:保护数据类型的安全。
语法:

Collection<数据类型> c1 = new ArrayList();//JDK1.7版本之后 

示例:

Collection<String> c1 = new ArrayList();//jdk1.7版本之后,后⾯不⽤再声明<String>
c1.add("hello");
c1.add("world");
System.out.println(c1);

泛型的定义

定义含有泛型的类

定义格式

修饰符 class 类名<代表泛型的变量> { } 

在创建对象的时候确定泛型
示例:

//作⽤在类上的泛型:当数据类型不确定的时候,可以⼀个泛型,通过创建对象传递过来⼀个类型,来确定T的类型
class Point<T>{
private T x;
private T y;
public static <M> void test(M m){//静态⽅法上要单独声明,它不能使⽤类上⾯的声明的泛型,调⽤静态⽅法的时候,确定类型
System.out.println("检测到了静态⽅法上的泛型:"+m);
}
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 class Demo {
public static void main(String[] args) {
Point<String> point = new Point<>();
point.setX("wowow");
point.setY("wowow");
Point<Integer> point4 = new Point<>();
point4.setY(2);
point4.setX(3);
Point.test("wowo");
Point.test(23);
}
}

定义含有泛型的⽅法

定义格式

修饰符 <代表泛型的变量> 返回值类型 ⽅法名(参数){ } 

调⽤⽅法时,确定泛型的类型
示例:

//作⽤在类上的泛型:当数据类型不确定的时候,可以⼀个泛型,通过创建对象传递过来⼀个类型,来确定T的类型
class Point{
public static <M> void test(M m){//静态⽅法上要单独声明,它不能使⽤类上⾯的声明的泛型,调⽤静态⽅法的时候,确定类型
System.out.println("检测到了静态⽅法上的泛型:"+m);
}
}
/**
* 泛型
*/
public class Demo {
public static void main(String[] args) {
Point.test("wowo");
Point.test(23);
}
}

含有泛型的接⼝

定义格式:

修饰符 interface接⼝名<代表泛型的变量> { } 

示例:

/**
* 接⼝上声明泛型
* @param <T1>
* @param <T2>
*/
public interface A<T1,T2> {
void test1(T1 t1);
void test2(T2 t2);
}
public class AImpl implements A<String,Integer> {
@Override
public void test1(String s) {
}
@Override
public void test2(Integer integer) {
}
}

泛型通配符

当使⽤泛型类或者接⼝时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是⼀旦使⽤泛型的通配符后,只能使⽤Object类中的共性⽅法,集合中元素⾃身⽅法⽆法使⽤。
?:通配符,不确定类型,代表集合中可以存储任意类型的数据。
List:该容器有数据类型:Object
List<?>:该容器的数据类型可以是任意的

? extends E
限定了上限,集合的泛型:E以及E的⼦类
? super E 限定了下限,集合泛型:E以及E的⽗类

示例:

class Person{}
class Student extends Person{}
public class Demo3 {
//?代表可以接收任意类型
public static void test1(List<?> list){
}
public static void test2(List<Object> list){
}
//? extends Person限定所有类型是Person以及Person的⼦类,
public static void test3(List<? extends Person> list){}
//? super Student限定所有类型是Student以及Student的⽗类
public static void test4(List<? super Student> list){}
public static void main(String[] args) {
List<String> list1 =new ArrayList<String>();
List<Integer> list2 = new ArrayList<>();
test1(list2);
List<Object> list3 = new ArrayList<>();
list3.add(1);
list3.add("wowo");
test2(list3);
List<Person> list4 = new ArrayList<>();
List<Student> list5 = new ArrayList<>();
test3(list4);
test4(list4);
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值