Java -- 泛型
来源:互联网 发布:yaml nginx 编辑:程序博客网 时间:2024/05/29 13:43
Java – 泛型
一.作用
- 安全:使用泛型可以在编译的时检查类型安全
- 省心:所以的强制类型转换都是隐式的,不需要手动强制转换,减少错误。
二.泛型类
1.声明时使用泛型,调用时候确定具体类型
class Student<T>//声明类的时候使用泛型{ T javaScore; T oracleScore;}public class TestGeneric { public static void main(String[] args) { Student<Double> student = new Student();//只能是引用类型 student.javaScore = 123.5; //不能是基本类型 student.oracleScore = 123.5; }}
2. 泛型类声明时,字母不能使用在静态属性和静态方法上
public static T test //错,不能用在静态方法中
3. 接口中,泛型字母只能使用在方法中,不能使用在全局变量中 因为接口只包括全局常量和公共、抽象方法,而全局变量是static的,所以不能用,所以只能用在方法中4.关于泛型父类和子类的问题 (1)子类声明时指定了具体类型, 子类的属性和方法均为子类类型
abstract class father<T> { T name; public abstract void setName(T name) } class child extends father<String> { String t2; @Override public void setName(String name) { this.name = name; } }
(2)子类为泛型类,父类不指定泛型 则类型变量必须和父类的保持一致(顺序可以不同) 调用的时候确定具体类型
abstract class father<T,T1> { T name; T1 age; public abstract void setName(T name) ; public abstract void setAge(T1 age) ; } class child<T1,T> extends father<T,T1> { T1 t2; T t; @Override public void setName(T name) { } @Override public void setAge(T1 age) { } }
(3)子类为泛型类,父类没有指定泛型(类型擦除),使用Object替换
class child3<T1,T2> extends father
(4)子类和父类同时擦除
class child4 extends father{ @Override public void setName(Object name) { } @Override public void setAge(Object age) { }}
(5)错误!: 子类擦除,父类指定泛型5.属性类型 父类中随父类而定 子类中随子类而定6.方法重写 随父类而定
总结:子类指定的泛型必须大于等于父类的泛型
二.泛型方法
- 只能访问对象的信息,不能修改对象的信息
因为对象的类型还没有定,所以没法修改
public class TestGeneric { public static void main(String[] args) { test("aaaa"); } public static <T> void test(T a) { System.out.println(a); }}
三.泛型擦除 继承|声明实现不指定类型,使用时不指定类型, 则统一Object对待,擦除后不会有类型检查 1.会有编译器warning四.泛型没有多态 首先回顾一下多态 多态有两种形式:形参多态、返回类型多态
public class TestGeneric { public static void main(String[] args) { test(new Apple()); } public static <T> void test(Fruit f){} }
public static Fruit test(Fruit f) { return new Apple(); }
不过,要想在泛型中实现多态的功能,必须要借助通配符五.通配符: ? extends super 1.可以用在声明类型和声明方法参数上,不能用在声明类上 2.?表示类型不定,使用时确定,用? 和 extends可以达成类似于多态的功能。表示制定的类<=,称为上限,指定类型为自身或者子类
public static void main(String[] args) { test(new Student<Apple>()); } public static void test(Student<? extends Fruit> f) { }
3.? super 表示 >= ,称为下限,指定类型为自身或者父类4.? 只能接受和输出类型,不能修改六.泛型嵌套 1.声明:嵌套使用泛型 2.使用:从外到内,一层层拆分
public class MY<T>{ T stu; public static void main(String[] args) { //声明时使用嵌套 MY<Student<String>> room = new MY<Student<String>>(); //使用时候,一层层拆分 room.stu = new Student<>(); Student<String> stu = room.stu; String score = stu.oracleScore; System.out.println(score); }}
七.泛型与数组 没有泛型数组,不能创建泛型数组 不过可以用?来声明,但创建失败 可以加到class里,然后强制类型转换
public class myArray<E>{ //用Object来接收任意类型 Object[] cap = new Object[10]; //用强转. public void Add (int index, E elem) { cap[index] = elem; } public E[] getAll() { return (E[])cap; } public E getEle(int index) { return (E)cap[index]; }
八.JDK1.7中使用泛型 声明时使用泛型,创建对象时不需要继续写泛型,写个<>就可以
myArray<String> myArray = new myArray<>();
0 0
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- React Native 开发常见错误
- POJ 1178 Camelot 最短路 Floyd +枚举
- Node.js 定时器
- WKWebView 遇到过的坑
- nyoj-106-背包问题
- Java -- 泛型
- c51-i2c协议代码实现
- MTK平台LED配置
- Android-transulcent-status-bar总结
- 汉诺塔递归与非递归
- (转)开发仅用两天三个人,谈谈小咖秀背后的技术故事
- C++标准模板库<algorithm>下的函数sort
- 1086: 去掉双斜杠注释
- 链表 进栈出栈遍历清空