Java - 泛型

其他关于泛型的博客:链接

一、泛型语法和使用

1. 泛型使用的注意事项和细节

image.png
image.png

二、自定义泛型

1. 自定义泛型类

image.pngimage.png
image.png

2. 自定义泛型接口

image.png

  • 注:接口中的成员是静态的。

## 3. 自定义泛型方法 ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22870205/1649319785155-15b7311f-3e91-4d45-b42f-77591958cd3e.png#clientId=u01cee153-ae67-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=487&id=ud010049e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=604&originWidth=1387&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1085113&status=done&style=none&taskId=uf0d8ea76-a98f-4e64-9c90-da287794ad2&title=&width=1118.9243338793478)
示例: ```java package GenricExcise_;

public class excise02 {
public static void main(String[] args) {
Apple<String,Integer,Double> apple = new Apple<>();
apple.fly(10);//10 会被自动装箱 Integer10
apple.fly(new Dog());
}
}

class Apple<T,B,M> {
public void fly(E e) {
System.out.println(e.getClass().getSimpleName());
}

//public void eat(U u){} //错误,因为U没有声明
public void run(M m){}

}

class Dog{}

代码运行结果:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22870205/1649327797597-bc2c6c4c-22a9-4998-87ad-0b4bbb95acc6.png#clientId=u01cee153-ae67-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=109&id=u771b25df&margin=%5Bobject%20Object%5D&name=image.png&originHeight=135&originWidth=619&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49584&status=done&style=none&taskId=u14c98edd-157a-4652-9f3f-932063c375e&title=&width=499.3613285301488)

<a name="EVQCe"></a>
## 4. 泛型的继承和通配符
<a name="NEQ5X"></a>
### (1)泛型的继承和通配符说明
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22870205/1649327974707-f069a13c-d7ad-4d7d-9eab-e3f938a6cd54.png#clientId=u01cee153-ae67-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=499&id=ucf619728&margin=%5Bobject%20Object%5D&name=image.png&originHeight=619&originWidth=1397&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1006939&status=done&style=none&taskId=u8ba1bbdc-4dd6-4bb5-8c9a-933df4de4ac&title=&width=1126.9915605114988)

示例:
```java
package GenricExcise_;

import java.util.ArrayList;
import java.util.List;

public class CustomGeneric {
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<AA> list3 = new ArrayList<>();
        List<BB> list4 = new ArrayList<>();
        List<CC> list5 = new ArrayList<>();

        //如果是 List<?> c,可以接受任意的泛型类型
        printCollection(list1);
        printCollection(list2);
        printCollection(list3);
        printCollection(list4);
        printCollection(list5);

        //printCollection2(list1); Object不是AA的子类
        //printCollection2(list2); String不是AA的子类
        printCollection2(list3);
        printCollection2(list4);
        printCollection2(list5);

        printCollection3(list1);
        //printCollection3(list2); String不是AA的父类
        printCollection3(list3);
        //printCollection3(list4); BB不是AA的父类
        //printCollection3(list5); CC不是AA的父类
    }

    //说明:List<?> 表示 任意的泛型类型都可以接受
    public static void printCollection(List<?> c) {
        for (Object o : c) { //通配符,取出时,就是 Object
            System.out.println(o);
        }
    }

    // ? extends AA 表示 上限,可以接受 AA 或者 AA子类
    public static void printCollection2(List<? extends AA> c) {
        for (Object o : c) {
            System.out.println(o);
        }
    }

    // ? super 子类类名AA 表示支持AA类以及AA类的父类,不限于直接父类
    public static void printCollection3(List<? super AA> c) {
        for (Object o : c) {
            System.out.println(o);
        }
    }
}

class AA{}
class BB extends AA{}
class CC extends AA{}

三、JUnit 单元测试类

image.png
image.png
设置完成后,可以看到函数可以直接运行,下面为结果:
image.png

posted @ 2022-07-02 20:10  interestinmachine  阅读(28)  评论(0)    收藏  举报