关于Java的通配符边界

首先

关于Java的通配符界限,总结如下。
主要有三种形式:
– 无界通配符
– 上界通配符
– 下界通配符

非界境的野牌

使用通配符”?”可以在泛型声明时,以不限制类型参数的方式处理类。它主要具有两个特点:
– 方法的返回类型将是Object类型。
– 方法的参数只能传递null字面值。

public class Main {
    public static void main(String[] args) throws Exception {
        // 非境界ワイルドカードを使用しリストを宣言
        ArrayList<?> list = new ArrayList<>();

        ArrayList<String> strList = new ArrayList<>();

        ArrayList<Integer> intList = new ArrayList<>();
        
        list.containsAll(strList);
        list.containsAll(intList);
    }
}

上限境界的万金油

泛型声明时使用”extends”,限制可以用作类型参数的类的范围。对于”<? extends T>”,只能处理T或T的子类类型。
– 方法的返回值可以是任何类型。
– 方法的参数只能传递空值字面量。

public class Main {
    public static void main(String[] args) throws Exception {
        
        ArrayList<Integer> intList = new ArrayList<>();
        
        ArrayList<String> strList = new ArrayList<>();

        // IntegerはNumberのサブクラスのため呼び出すことができる
        testList(intList);
        // StringはNumberのサブクラスではないためコンパイルエラー
        testList(strList);
    }

    // 上限境界ワイルドカードを使用したメソッド    
    public static void testList(List<? extends Number> list) {
        // listに関する処理
    }
}

下限境界是一个野卡。

“super” is used in generics declarations, such as <? super T>, to restrict the range of classes that can be used as type parameters.
In the case of <? super T>, only the type T or its superclass type can be handled.
-The return type of the method becomes Object type.
-Any type can be passed as an argument to the method.

public class Main {
    public static void main(String[] args) throws Exception {
        
        ArrayList<Number> numList = new ArrayList<>();
        
        ArrayList<String> strList = new ArrayList<>();

        // NumberはIntegerのスーパークラスのため呼び出すことができる
        testList(numList);
        // StringはIntegerのスーパークラスではないためコンパイルエラー
        testList(strList);
    }

    // 下限境界ワイルドカードを使用したメソッド    
    public static void testList(List<? super Integer> list) {
        // listに関する処理
    }
}
广告
将在 10 秒后关闭
bannerAds