JAVA Type之WildcardType 泛型表达式

JAVA Type之WildcardType 泛型表达式

Scroll Down

Java类型之WildcardType 泛型表达式

通配符表达式,泛型表达式,也可以说是,限定性的泛型,形如:? extends classA? super classB

源码

public interface WildcardType extends Type {
    //获得泛型表达式上界(上限)
    Type[] getUpperBounds();
    //获得泛型表达式下界(下限)
    Type[] getLowerBounds();
}

概述

WildcardType,通配符表达式,Type子接口,但是在Java中并没有WildcardType类型

getUpperBounds

获取泛型表达式上界,

根据API的注释提示:现阶段通配符表达式仅仅接受一个上边界或者下边界,这个和定义类型变量时候可以指定多个上边界是不一样。但是API说了,为了保持扩展性,这里返回值类型写成了数组形式。实际上现在返回的数组的大小就是1,通配符?指定多个上边界或者下边界现在是会编译出错的(jdk1.7是这样的,至于7及以后就不知道了)。得到的是类型的上边界的Type数组,实际上就是类型的直接父类,也就是extends后面的类型

getLowerBounds

获取泛型表达式下界。

public class WildcardTypeTest {

    public <T> void test(List<? extends ClassA2> a) {
    }

    public <T> void test2(Map<? extends String, ? super String> a) {

    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = WildcardTypeTest.class.getMethod("test", List.class);
        System.out.println("test ");
        Type[] parameterTypes = method.getGenericParameterTypes();
        for (Type parameterType : parameterTypes) {
            if (parameterType instanceof ParameterizedType) {
                Type[] arguments = ((ParameterizedType) parameterType).getActualTypeArguments();
                for (Type argument : arguments) {
                    if (argument instanceof WildcardType) {
                        System.out.println("通用表达式:" + argument);
                        Type[] upperBounds = ((WildcardType) argument).getUpperBounds();
                        Type[] lowerBounds = ((WildcardType) argument).getLowerBounds();
                        System.out.println("表达式上边界:" + Arrays.asList(upperBounds));
                        System.out.println("表达式下边界:" + Arrays.asList(lowerBounds));
                    }
                }
            }
        }
        method = WildcardTypeTest.class.getMethod("test2", Map.class);
        System.out.println("test2");
        parameterTypes = method.getGenericParameterTypes();
        for (Type parameterType : parameterTypes) {
            if (parameterType instanceof ParameterizedType) {
                Type[] arguments = ((ParameterizedType) parameterType).getActualTypeArguments();
                for (Type argument : arguments) {
                    if (argument instanceof WildcardType) {
                        System.out.println("通用表达式:" + argument);
                        Type[] upperBounds = ((WildcardType) argument).getUpperBounds();
                        Type[] lowerBounds = ((WildcardType) argument).getLowerBounds();
                        System.out.println("表达式上边界:" + Arrays.asList(upperBounds));
                        System.out.println("表达式下边界:" + Arrays.asList(lowerBounds));
                    }
                }
            }
        }
    }
}

class ClassA2 {

}

结果:

test 
通用表达式:? extends com.hb0730.test.ClassA2
表达式上边界:[class com.hb0730.test.ClassA2]
表达式下边界:[]
test2
通用表达式:? extends java.lang.String
表达式上边界:[class java.lang.String]
表达式下边界:[]
通用表达式:? super java.lang.String
表达式上边界:[class java.lang.Object]
表达式下边界:[class java.lang.String]

系列

  1. ParameterizedType 泛型/参数化类型【重要】
  2. TypeVariable 类型变量/泛指任何类【掌握】
  3. GenericArrayType (泛型)数组类型
  4. WildcardType 通配符(泛型)表达式

作者:a327369238
链接:https://blog.csdn.net/a327369238
来源:csdn