代码之家  ›  专栏  ›  技术社区  ›  Damian Leszczyński - Vash

Java通用参数之间的差异

  •  2
  • Damian Leszczyński - Vash  · 技术社区  · 16 年前

    传入带有或不带泛型参数的泛型类的泛型参数有什么区别?

    例子:

    简单泛型类:

    public class Foo<T> { /*...*/ }
    

    简单类,扩展简单泛型类,将泛型参数设置为一些不相关的类型:

    public class FooFoo extends Foo<Type1> { /*...*/ }
    

    另一个泛型类

    public class Bar<T> extends FooFoo { /*...*/ }
    

    作为泛型参数的基类需要扩展类foo

    public class TestFooClass<T extends Foo<?>> { /*...*/ }
    

    问题是这两个参数之间的差异是什么

    public class BarTestOne extends TestFooClass<Bar> { /*...*/ }
    
    public class BarTestTwo extends TestFooClass<Bar<?>> { /*...*/ }
    

    问题

    Class<T> class = (Class<T>) ((Foo)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    

    在第一种情况下,代码有效,而在第二种情况下则无效。

    2 回复  |  直到 16 年前
        1
  •  3
  •   finrod    16 年前

    看起来您正在尝试确定testfooclass参数化的实际类型?

    在该上下文中,使用带有或不带泛型参数的泛型类的区别在于getActualTypeArguments()[0]将:

    1. 在第一种情况下,提供表示原始类型的类的实例
    2. 在第二种情况下,提供一个参数化类型的实例(因此可以获得ClassCastException)。如果对该参数化类型调用get raw type(),将获得表示原始类型的类。

    这是:

    BarTestOne one = new BarTestOne();
    BarTestTwo two = new BarTestTwo();
    
    Class<?> clazz1 = (Class<?>) ((ParameterizedType) one.getClass().getGenericSuperclass()).getActualTypeArguments()[0];       
    Class<?> clazz2 = (Class<?>) ((ParameterizedType) ((ParameterizedType) two.getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getRawType();
    
    System.out.println(clazz1.equals(clazz2));
    

    这个会回来的 .

    唉,任何更深层次的回答都超出了我对仿制药的了解。

        2
  •  0
  •   Silly Freak    16 年前

    Bar 方法 Bar<Object> Bar<?> 没有。例如,如果你有 List ,如果您有 List<?> 不能,因为编译器不知道对象是否与对象的“实际泛型类型”兼容。

    至于反射代码,我不知道。它说 getClass() ,这取决于调用它的对象;在这种情况下,对象显然是 this …从何处调用此代码?