泛型<>

1. 泛型介绍

Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的
数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和
方法的创建中,分别称为泛型类、泛型接口、泛型方法。
场景:一个魔法口袋,每一个口袋实例可以存储任意一种指定引用类型的数据,存
储的数据类型是不确定,将类型作为参数

2. 泛型类和泛型接口

如果定义的一个类或接口有一个或多个类型变量,则可以使用泛型。泛型类型变量由尖括号界定,放在类或者接口名的后面

下面定义尖括号中的T称为类型变量。意味着一个变量将被ing一个类型替代,替代类型变量的值将被当作参数或者返回类型

人类:不同爱好,爱好进行泛化

泛型符号:只是一个符号,一个占位符而已,不存在任何意义,我们习惯使用大写的字母 T,E,K,V

public class className<泛型符号1,泛型符号2...>{} 

public interface interfaceName<泛型符号1,泛型符号2...>{} 


public class className inplements interfaceName<T>{}

如果一个类区实现的接口是泛型接口,实现类也必须是泛型类,而且泛型符号还必
须和接口保持一致,还可以新增符号

public class Person<T>{}
 public interface List<T> extends Collection<T>{ } 

3. 泛型方法
是否拥有泛型方法,与其所在的类是否泛型无关。要定义泛型方法,只需将泛型参数列表置于返回值前。使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。

public <泛型符号1,泛型符号2...> returnValue funName(){}

泛型方法的调用方式和普通方法一模一样

public<T> voidf(T x){ System.out.println(x.getClass().get Name()); }

泛型方法:可以是静态的 使用泛型的方法:不能是静态的

4. 注意事项
在定义一个泛型类时,在<>之间定义类型参数,例如:class TestGen<K,Y>
不代表值,而是表示类型。
使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型;Java中的
普通方法,构造方法中都可以使用泛型,方法使用泛型之前必须先对泛型进行
声明,可以使用任意字母,一般都要大写
不可以用泛型构造对象,即: first = new T(); 是错误的。
在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰;如果
一个静态方法需要使用泛型的话,该方法需要定义成泛型方法

5. 泛型通配符 <?>

本质上从同一个泛型类衍生出来的类实例化的对象 类型都是一样 泛型类
因为同一个泛型类衍生出来的多个类之间没有任何关系,也不可以互相赋值,自然
不能互相替换;由此需要对每一个泛型实例进行分别处理,为了解决这个问题可以
使用泛型通配符解决

public class Test { public static void main(String[] args) { 
Person<String> p = new Person<>();
 Person<Object> p1 = new Person<>(); 
 new Test().test(p1); 
 new Test().test(p); 
 }

public void test(Person<?> p){
 }  
 
}class Person<T>{ 
}

6. 泛型上下边界

在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:
类型实参只准传入某种类型的父类或某种类型的子类。

6.1. 上边界
为泛型添加上边界,即传入的类型实参必须是指定类型的子类型

public class Test {
public static void main(String[] args) {
 Person<Employee> p1 = null; 
 Person<Object> p2 = null;
  Person<Manager> p3 = null; 
  new Test().testU(p1);
   // new Test().testU(p2); 
   new Test().testU(p3); 
   }

public void testU(Person<? extends Employee> p){ }
 public void testD(Person<? super Employee> p){} 

}
class Person<T>{
} 
class Manager extends Employee{
} 

6.2. 下边界

为泛型添加下边界,即传入的类型必须是指定类型的父类型

public class Test { 
public static void main(String[] args) { 
Person<Employee> p1 = null; 
Person<Object> p2 = null; 
Person<Manager> p3 = null; 
new Test().testD(p1); 
new Test().testD(p2);
 // new Test().testD(p3);
  }
  
public void testU(Person<? extends Employee> p){} 
public void testD(Person<? super Employee> p){} 
}
// 泛型类指定上边界 class Person<T>{} 
class Manager extends Employee{}

7. 作用
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值