定义和使用含有泛型的接口和泛型通配符

定义和使用含有泛型的接口

含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型

publlc interface Iterator<E>{

  E next();

}

第一种方式:

创建接口

public interface GenericInterface<I> {
    public abstract void method(I i);
}

实现类

public class GenericInterfaceImpl implements GenericInterface<String>{
    @Override
    public void method(String s) {
        System.out.println(s);
    }
}

测试类

public class GenericInterfaceTest {
    public static void main(String[] args) {
        //创建GenericInterfaceImpl对象
        GenericInterfaceImpl gen = new GenericInterfaceImpl();
        gen.method("字符串");
    }
}

 

第二种方式:

含有泛型的接口第二种使用方式:接口使用什么泛型,实现类就使用的什么泛型,类跟着接口走就相当于定义了

一个含有泛型的类,创建对象的时候定义泛型的类型

public class GenericInterfaceImpl2<I> implements GenericInterface<I>{
    @Override
    public void method(I i) {
        System.out.println(i);
    }
}
GenericInterfaceImpl2<Integer> gin = new GenericInterfaceImpl2<>();
gin.method(10);
GenericInterfaceImpl2<Double> gin2 = new GenericInterfaceImpl2<>();
gin2.method(2.1);

 

泛型通配符

当使用泛型类或者接口是,传递的数据中,泛型类型不确定,则可以通过通配符<?>表示。

但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。

使用方式:

  不能创建对象使用

  只能作为方法的参数使用

当ArrayList集合使用什么数据类型,可以泛型的通配符?来接收数据类型

注意:

  泛型没有继承概念的

    public static void main(String[] args) {
        ArrayList<Integer> in = new ArrayList<>();
        in.add(1);
        in.add(2);
        ArrayList<String> strings = new ArrayList<>();
        strings.add("张三");
printArray(in); printArray(strings); }
public static void printArray(ArrayList<?> list){ Iterator<?> it = list.iterator(); while (it.hasNext()){ Object o = it.next(); System.out.println(o); } }

 

通配符高级使用---受限泛型

泛型的上限限定:?extends E  代表使用的泛型只能是E类型的子类/本身

泛型的上限限定:?super E  代表使用的泛型只能是E类型的父类/本身

    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<Number> list3 = new ArrayList<>();
        ArrayList<Object> list4 = new ArrayList<>();

        getElement1(list1);
        getElement1(list2);//报错
        getElement1(list3);
        getElement1(list4);//报错

        getElement2(list1);//报错
        getElement2(list2);//报错
        getElement2(list3);
        getElement2(list4);
        
    }
    //泛型的上限限定:?extends E  代表使用的泛型只能是E类型的子类/本身
    public static void getElement1(Collection<? extends Number> coll){}
    //泛型的上限限定:?super E  代表使用的泛型只能是E类型的父类/本身
    public static void getElement2(Collection<? super Number> coll){}

 

 

 

 

 

posted @ 2022-07-05 14:19  魔光领域  阅读(42)  评论(0编辑  收藏  举报