自定义泛型类、接口、方法
【摘要】 自定义泛型类基本语法class 类名<T,R...> {//...表示可以有多个泛型 成员}使用细节(1)普通成员可以使用泛型(属性、方法)(2)使用泛型的数组,不能初始化(3)静态方法中不能使用类的泛型(4)泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)(5)如果在创建对象时,没有指定类型,默认为Object应用案例import java.util.Array...
自定义泛型类
基本语法
class 类名<T,R...> {//...表示可以有多个泛型
成员
}
使用细节
(1)普通成员可以使用泛型(属性、方法)
(2)使用泛型的数组,不能初始化
(3)静态方法中不能使用类的泛型
(4)泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
(5)如果在创建对象时,没有指定类型,默认为Object
应用案例
import java.util.Arrays;
@SuppressWarnings({"all"})
public class CustomGeneric_ {
public static void main(String[] args) {
//T=Double, R=String, M=Integer
Tiger<Double,String,Integer> g = new Tiger<>("john");
g.setT(10.9); //OK
//g.setT("yy"); //错误,类型不对
System.out.println(g);
Tiger g2 = new Tiger("john~~");//OK T=Object R=Object M=Object
g2.setT("yy"); //OK ,因为 T=Object "yy"=String 是 Object 子类
System.out.println("g2=" + g2);
}
}
//1. Tiger 后面泛型,所以我们把 Tiger 就称为自定义泛型类
//2, T, R, M 泛型的标识符, 一般是单个大写字母
//3. 泛型标识符可以有多个. //4. 普通成员可以使用泛型 (属性、方法)
//5. 使用泛型的数组,不能初始化
//6. 静态方法中不能使用类的泛型
class Tiger<T, R, M> {
String name;
R r; //属性使用到泛型
M m;
T t;
//因为数组在 new 不能确定 T 的类型,就无法在内存开空间
T[] ts;
public Tiger(String name) {
this.name = name;
}
public Tiger(R r, M m, T t) {//构造器使用泛型
this.r = r;
this.m = m;
this.t = t;
}
public Tiger(String name, R r, M m, T t) {//构造器使用泛型
this.name = name;
this.r = r;
this.m = m;
this.t = t;
}
//因为静态是和类相关的,在类加载时,对象还没有创建
//所以,如果静态方法和静态属性使用了泛型,JVM 就无法完成初始化
// static R r2;
// public static void m1(M m) {
//
// }
//方法使用泛型
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public R getR() {
return r;
}
public void setR(R r) {//方法使用到泛型
this.r = r;
}
public M getM() {//返回类型可以使用泛型. return m;
}
public void setM(M m) {
this.m = m;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
@Override
public String toString() {
return "Tiger{" +
"name='" + name + '\'' +
", r=" + r +
", m=" + m +
", t=" + t +
", ts=" + Arrays.toString(ts) +
'}';
}
}
自定义泛型接口
基本语法
interface 接口名<T,R...> {
}
使用细节
(1)接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
(2)泛型接口的类型,在继承接口或者实现接口时确定
(3)没有指定类型,默认为Object
自定义泛型方法
基本语法
修饰符 <T,R...>返回类型 方法名(参数列表) {
}
使用细节
(1)泛型方法,可以定义在普通类中,也可以定义在泛型类中
(2)当泛型方法被调用时,类型会确定
(3)public void eat(E e){},修饰符后没有<T,R...> eat 方法不是泛型方法,而是使用了泛型
泛型的继承和通配符
说明
(1)泛型不具备继承性
(2)<?>:支持任意泛型类型
(3)<? extends A>:支持A类以及A类的子类,规定了泛型的上限
(4)<? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)