相关疑难解决方法(0)

泛型类的类对象(java)

有没有办法在java中获取类似的实例Class<List<Object>>

java generics

51
推荐指数
5
解决办法
5万
查看次数

带参数的通用方法与带通配符的非泛型方法

根据Java Generics FAQ中的此条目,在某些情况下,泛型方法没有使用通配符类型的等效非泛型方法.根据那个答案,

如果方法签名使用多级通配符类型,则泛型方法签名与其通配符版本之间始终存在差异.

他们举了一个方法的例子<T> void print1( List <Box<T>> list),"需要一个相同类型的盒子列表".通配符版本void print2( List <Box<?>> list)"接受不同类型的盒子的异构列表",因此不等同.

您如何解释以下两种方法签名之间的差异:

 <T extends Iterable<?>> void f(Class<T> x) {}
                         void g(Class<? extends Iterable<?>> x) {}
Run Code Online (Sandbox Code Playgroud)

直观地说,似乎这些定义应该是等价的.但是,调用f(ArrayList.class)使用第一种方法编译,但g(ArrayList.class)使用第二种方法调用会导致编译时错误:

g(java.lang.Class<? extends java.lang.Iterable<?>>) in Test
    cannot be applied to (java.lang.Class<java.util.ArrayList>)
Run Code Online (Sandbox Code Playgroud)

有趣的是,可以使用彼此的参数调用这两个函数,因为以下编译:

class Test {
    <T extends Iterable<?>> void f(Class<T> x) {
        g(x);
    }
    void g(Class<? extends Iterable<?>> x) {
        f(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用javap -verbose Test,我可以看到它f()具有通用签名

<T::Ljava/lang/Iterable<*>;>(Ljava/lang/Class<TT;>;)V;
Run Code Online (Sandbox Code Playgroud)

并 …

java generics

18
推荐指数
1
解决办法
1330
查看次数

标签 统计

generics ×2

java ×2