考虑以下代码片段

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


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

最佳答案

将第一个更改为此:

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


它会工作。那就是界限的不同。对于类型参数,您在声明类型参数的地方而不是在使用它的地方声明界限。对于通配符,由于没有这样的声明,因此请在使用它的位置和位置给出界限。顺便说一句,<T extends Object>可以只是<T>

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

07-24 09:33