什么是泛型
泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,而这种参数类型可以用在类、方法和接口中,分别被称为泛型类
、泛型方法
、泛型接口
。
注意:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
泛型的上限:
- 格式:
类型名称 <? extends 类 > 对象名称
- 意义:
只能接收该类型及其子类
泛型的下限:
- 格式:
类型名称 <? super 类 > 对象名称
- 意义:
只能接收该类型及其父类型
import javax.sound.midi.Soundbank;
/*
*
* 类泛型
* 方法泛型
* 接口泛型
* */
public class Student<T> {
/*
不确定address 是什么类型时,可以用T 代替,
在创建对象的时候可以进行定义
* */
private T address;
@Override
public String toString() {
return "Student{" +
"address=" + address +
'}';
}
T getAddress() {
return address;
}
void setAddress(T address) {
this.address = address;
}
/*
*
* 定义普通的泛型方法是可以脱离泛型类,单独定义。
* */
<M> void getname1(M name){
System.out.println( name+"忙着加班");
}
/*
*
* 静态泛型方法中的类型与类中的泛型占位符是没有任何关系的
* */
static <E> void getjin(E hao){
System.out.println( hao+"真优秀");
}
/*
* 注意:静态泛型是针对于整个类,而泛型类针对于对象
* */
static <E> E getjin2(E hao){
return hao;
}
/*
*上边界: 在读取T类型数据的时候,但不写入数据称为:上边界
* 可以 传入 extends T 类以及子类 -------- 可以看不可该
* */
public void show(Student<? extends T> s){
this.setAddress((T)s.getAddress());
}
/*
* 下边界:在写入数据的时候,但不需要进行去读。
* 可以 传入 super T 类以及父类
* */
void show1(Student<? super T> s){
this.setAddress((T)s.getAddress());
}
public static void main(String[] args) {
Student<String> b = new Student<>();
b.getname1("小刚");
Student.getjin("小紫");
System.out.println(Student.getjin2("你好"));
System.out.println("---------------------");
// super
Student<Number> w = new Student<>();
Student<Integer> w2 = new Student<>();
Student<String> w3 = new Student<>();
w2.setAddress(1111);
w.show(w2);
System.out.println(w);
System.out.println("------------------------------");;
// super
w.show1(w);
System.out.println(w);
StudentServiceimpl d = new StudentServiceimpl();
System.out.println("------------------------------");;
d.show3(666);
}
}
接口:
public interface StudentService<T> {
void show3(T yi);
}
实现类
/*
* 1.泛型接口的实现类可以指定具体的泛型接口的泛型类型
* 2.泛型接口的实现类没有指定具体的类型时,
* 必须在实现类中声明一个泛型类型的占位符给接口用
* https://www.jb51.net/article/216499.htm#_label0
* */
public class StudentServiceimpl<T> implements StudentService<T> {
@Override
public void show3(T yi) {
System.out.println(yi);
}
}