为什么要使用泛型
- 类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,直接在 编译的就会提示错误。
- 消除强制类型转换。
- 提升性能
- 泛型说白了就是类型占位符
代码演示
泛型类 和泛型成员变量
/**
* 成员变量 必须和类的泛型一致
* 区别于泛型方法
*
* Created by kumamon on 2021/5/10.
*/
public class Person<T> {
public T name;
@Override
public String toString() {
return "Person{" +
"name=" + name +
'}';
}
}
/**
* 成员变量 必须和类的泛型一致 可以使用多个泛型
* Created by kumamon on 2021/5/10.
*/
public class Person1<K,V,M> {
public K name;
public V age;
public M address;
public K getName() {
return name;
}
@Override
public String toString() {
return "Person1{" +
"name=" + name +
", age=" + age +
", address=" + address +
'}';
}
}
------------------------------------------------------------------------------------------------
public class FxTest {
public static void main(String[] args) {
/**
*泛型变量
* 不能自定义泛型,必须使用类的泛型
*/
Person<String> p = new Person<String>(); //
p.name = "张三"; //指定了泛型,所以必须是String
Person1<String, Integer, Float> p1 = new Person1<String, Integer, Float>(); //类的多泛型
p1.name = "张三"; //指定了泛型 String
p1.age = 18; //指定了泛型 Integer
p1.address = 20.f; //指定了泛型 Float
}
}
泛型方法(可以脱离类的泛型)
/**
* 静态方法 和 成员方法 可以脱离类的泛型,
* Created by kumamon on 2021/5/10.
*/
class PersonMethod<T> {
public static <E> void show(E name){ //自定义静态方法自己的泛型,和类的泛型无关
System.out.println("静态泛型 name:"+name);
}
public static <M> M show2(M name){ //自定义静态方法,具有返回值的泛型 ,和类的泛型无关
System.out.println("返回值静态泛型 name:"+name);
return name;
}
public <K> void show3(K name){ //自定义成员方法,使用自己的泛型 ,和类的泛型无关
System.out.println("成员方法自定义泛型 name:"+name);
}
public void show4(T name){ //使用了类的泛型,调用是必须和类的泛型一致
System.out.println("成员方法泛型 name:"+name);
}
}
---------------------------------------------------------------------------------------------------------------
public class FxTest {
public static void main(String[] args) {
/**
*泛型方法
* 可以自定义泛型
*/
PersonMethod<Integer> personMethod = new PersonMethod<>();//后面的泛型可以省略
PersonMethod.show("张三"); // 静态方法虽然泛型类指定了Interger, 但是方法可以自己定义泛型
String name = PersonMethod.show2("张三"); //同上, 也可以自定义返回值为泛型
personMethod.show3("张三"); //成员方法, 同上
personMethod.show4(123); //成员方法 使用了类的泛型,必须为Integer
}
}
泛型接口(两种方式)
/**
* Created by kumamon on 2021/5/10.
*/
public interface IPerson<T> {
abstract void show(T name);
}
------------------------------------------------------------------------------------------
public class PersonImpl implements IPerson<String> {
@Override
public void show(String name) {
System.out.println("实现类直接指定泛型");
}
}
--------------------------------------------------------------------------------------------
public class PersonImpl2<T> implements IPerson<T>{
@Override
public void show(T name) {
System.out.println("实现类不指定泛型,使用接口泛型");
}
}
---------------------------------------------
public class FxTest {
public static void main(String[] args) {
/**
*泛型接口
*/
IPerson person=new PersonImpl();
person.show("实现类 直接指定泛型"); //必须指定为String 要不然运行时会报错
//person.show(111); 因为使用了多态,(编译是看左边的) 接口没有指定泛型,所以编译的时候不报错
-------------------------------------------------------------------
IPerson<String> pp=new PersonImpl2<String>(); // 调用方法时候指定泛型
pp.show("name"); //此处只能为String
}
泛型檫除(运行阶段移除所有的泛型)
public class FxTest {
public static void main(String[] args) {
/**
*泛型檫除
* 在运行阶段会将所有的泛型进行移除
* java中的泛型其实只存在于编译阶段
*
*/
Person<String> pp1=new Person<>();
Person<String> pp2=new Person<>();
Person<Integer> pp3=new Person<>();
System.out.println(pp1.getClass() == pp2.getClass()); //true
System.out.println(pp1.getClass() == pp3.getClass()); //true
}
网友评论