Java泛型参数之间的差异

Java泛型参数之间的差异,java,generics,parameters,Java,Generics,Parameters,传入泛型参数与传入带有泛型参数的泛型类和不带泛型参数的泛型类有什么区别 例如: 简单泛型类: public class Foo<T> { /*...*/ } 公共类Foo{/*…*/} 扩展简单泛型类的简单类,将泛型参数设置为一些不相关的类型: public class FooFoo extends Foo<Type1> { /*...*/ } public类foooo扩展了Foo{/*…*/} 另一个泛型类 public class Bar<T> e

传入泛型参数与传入带有泛型参数的泛型类和不带泛型参数的泛型类有什么区别

例如:

简单泛型类:

public class Foo<T> { /*...*/ }
公共类Foo{/*…*/}
扩展简单泛型类的简单类,将泛型参数设置为一些不相关的类型:

public class FooFoo extends Foo<Type1> { /*...*/ }
public类foooo扩展了Foo{/*…*/}
另一个泛型类

public class Bar<T> extends FooFoo { /*...*/ }
公共类栏扩展了foooo{/*…*/}
作为泛型参数的基类需要一些扩展类Foo的东西

public class TestFooClass<T extends Foo<?>> { /*...*/ }
公共类TestFooClass>{/*…*/}
问题

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

在第一种情况下,代码起作用,而在第二种情况下则不起作用

Bar
表示
Bar
,而
Bar
不表示。例如,如果您有一个
列表
,您可以向其中添加,如果您有
列表
,您不能,因为编译器不知道您的对象是否与对象的“实际泛型类型”兼容


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

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

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

  • 在第一种情况下,提供表示原始类型的类的实例
  • 在第二种情况下,提供ParameterizedType的实例(因此可能会得到ClassCastException)。如果对该ParameteredType调用getRawType(),则将得到表示原始类型的类
  • 这:

    BarTestOne one=新的BarTestOne();
    BARTESTwo=新的BARTESTwo();
    类clazz1=(类)((ParameterizedType)one.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    类CLAZ2=(类)((参数化类型)((参数化类型)2.getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getRawType();
    System.out.println(clazz1.equals(clazz2));
    
    这将成为现实


    唉,任何更深层次的答案都超出了我对泛型的理解。

    是的,但在本例中,条形或条形具有相同的影响。实际上,条形是条形的原始超类型,条形是条形的子类型。另请参见
    Class<T> class = (Class<T>) ((Foo)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    
    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));