目录
为什么用泛型
早期的Object类型可以接收任意的对象类型,但是在实际的使用中, 会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这 个安全问题。
什么是泛型
泛型 类型不确定,可以把类型当做参数传递进来
代码
package com.ffyc.javacollection.fx;
import java.lang.reflect.Field;
public class Demo<T> {
T account;//105560 cfgct225
public T getAccount() {
return account;
}
public void setAccount(T account) {
this.account = account;
}
public static void main(String[] args) throws NoSuchFieldException {
Demo<String> demo1 = new Demo<>();
demo1.setAccount("agge545s7d0");
demo1.getAccount();
Demo<Integer> demo2 = new Demo<>();
demo2.setAccount(155787);
demo2.getAccount();
}
}
泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开 放相同的接口。
代码一
package com.ffyc.javacollection.fx;
public class MyArray1 {
Object[] object = new Object[30];
public void add(Object obj){
}
public Object get(){
return 1;
}
public static void main(String[] args) {
//MyArray 里面定义了一个Object类型的数组,可以存储任何数据类型
MyArray1 myArray = new MyArray1();
myArray.add("abc");
myArray.add(true);
myArray.add(1);
Object obj = myArray.get();
if(obj instanceof String){
String str = (String)obj;
str.length();
}
}
}
代码二
在定义时,为类指定类型,在编译期间添加数据时,进行类型检验
1、泛型的类型参数只能是类类型
2、泛型的类型参数可以有多个
3、如果没有定义具体类型,默认为Object
package com.ffyc.javacollection.fx;
//<A> 可以是任意的标识符,可以定义多个泛型
public class MyArray2<A,B> {
A[] objects = (A[]) new Object[30];
A name;
public A getName() {
return name;
}
public void setName(A name) {
this.name = name;
}
public void add(A obj){
}
public A get(){
return null;
}
public static void main(String[] args) {
MyArray2<String,Integer> myArray1 = new MyArray2();
myArray1.add("abc");
myArray1.get();
MyArray2<Integer,String> myArray2 = new MyArray2();
myArray2.add(10);
myArray2.get();
MyArray2 myArray3 = new MyArray2();
myArray3.add("");
}
}
从泛型类派生子类
package com.ffyc.javacollection.fx;
import java.lang.reflect.Field;
public class Demo<T> {
T account;//105560 cfgct225
public T getAccount() {
return account;
}
public void setAccount(T account) {
this.account = account;
}
public static void main(String[] args) throws NoSuchFieldException {
Demo<String> demo1 = new Demo<>();
demo1.setAccount("agge545s7d0");
demo1.getAccount();
Demo<Integer> demo2 = new Demo<>();
demo2.setAccount(155787);
demo2.getAccount();
}
}
子类
一个类继承了一个泛型类,有两种实现方式
方式一
1、子类和父类都为泛型类,这样定义子类时,传入类型,子类中的与父类的类型一致
package com.ffyc.javacollection.fx;
public class A<T> extends Demo<T>{
T password;
public static void main(String[] args) {
A<String> a = new A();
a.setAccount("ancxge");
}
}
方式二
2、子类不是泛型类,父类的泛型类型必须是确定的
package com.ffyc.javacollection.fx;
public class B implements Comparable<B>{
@Override
public int compareTo(B o) {
return 0;
}
public static void main(String[] args) {
B b = new B();
}
}
泛型接口
定义:
泛型接口与泛型类的定义及使用基本相同。
public interface Demo<T> { //定义一个泛型接口 }
子类:
子类也是泛型类,子类和父类的泛型类型要一致
class A<T> implements Demo<T>{ }
子类不是泛型类,父类要明确泛型的数据类型
public class A implements Demo<String> { }
类型擦除
定义
泛型的擦除:
虽然我们定义时,定义了明确的类型,但是实际底层处理时,统一都转为Object类型,与之前的代码兼容
泛型意义在于,编译期间添加获取元素时,他的元素类型是统一的
代码
package com.ffyc.javacollection.fx;
import java.lang.reflect.Field;
public class Demo<T> {
T account;//105560 cfgct225
public T getAccount() {
return account;
}
public void setAccount(T account) {
this.account = account;
}
public static void main(String[] args) throws NoSuchFieldException {
Demo<Integer> demo2 = new Demo<>();
demo2.setAccount(155787);
demo2.getAccount();
//从demo2对象中取出account属性
Field account = demo2.getClass().getDeclaredField("account");
//获取到属性运行时,实际的类型
System.out.println(account.getType());
}
}