在类中使用子类型作为类型参数

时间:2015-03-18 16:18:07

标签: java generics covariance contravariance

请考虑以下代码段

    public static <T> String typeName1(Class<T extends Object> c) {
        return c.getSimpleName();
    }
    public static  String typeName2(Class<? extends Object> c) {
        return c.getSimpleName();
    }

第一个显示编译时错误,第二个编译成功。 为什么会这样?

1 个答案:

答案 0 :(得分:3)

将第一个更改为:

public static <T extends Object> String typeName(Class<T> c) {
    return c.getSimpleName();
}

它会起作用。这就是你放置界限的区别。对于type参数,您声明声明类型参数的边界,而不是声明使用它的位置。对于通配符,由于没有这样的声明,因此您可以在使用它时给出界限。顺便说一句,<T extends Object>只能是<T>

public static <T> String typeName(Class<T> c) {
    return c.getSimpleName();
}