废话不多说,把下面这个方法跑一下,就OK了,参数是子类Class,返回值是子类继承父类时给父类传入的泛型参数,该方法假定父类只有一个泛型参数,否则抛出异常。
public static Class getGenericSuperclassBounds(Class childClass){
Type type = childClass.getGenericSuperclass();
while(!(type instanceof Class)){
if(type instanceof WildcardType){
type = ((WildcardType)type).getUpperBounds()[0];
}
else if(type instanceof TypeVariable<?>){
type = ((TypeVariable<?>)type).getBounds()[0];
}
else if(type instanceof ParameterizedType){
ParameterizedType ptype = (ParameterizedType)type;
Type[] types = ptype.getActualTypeArguments();
if(types==null||types.length==0){
return Object.class;
}
if(types.length>1){
throw new RuntimeException(childClass.getName()+"继承的泛型"+ptype+"的实参数量多于1个");
}
type = ptype.getActualTypeArguments()[0];
}
else if(type instanceof GenericArrayType ){
type = ((GenericArrayType)type).getGenericComponentType();
}
}
return (Class)type;
}
分享到:
相关推荐
获取泛型参数通常在子类继承泛型父类时有需求。例如,有一个泛型基类`Foo<T>`,其子类`FooChild`传入了一个具体的泛型参数`Bar`,要获取这个参数类型,通常有两种常见做法: a. 在基类中定义一个构造函数,传入...
- 当子类继承泛型父类时,可以指定不同的类型参数,实现多态性。 - 也可以使用类型参数`<?>`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** -...
在上面的代码中,我们使用 `getClass().getGenericSuperclass()` 方法获取当前类的父类,然后使用 `ParameterizedType` 对象获取泛型类型参数。最后,我们使用 `clazz.newInstance()` 方法实例化泛型对象。 完整...
Java反射机制为开发者提供了强大的能力,可以动态加载类、创建对象、访问私有成员、处理泛型等。然而,反射也可能会降低程序的性能,并且可能导致安全问题,因此在使用时需要谨慎。在理解了这些基本概念后,你可以...
deriveClass.java 子类访问父类变量示例 getLinePara.java 获取命令行参数示例 hasStaticMethod.java 静态成员方法示例 hasStatMember.java 静态成员变量示例 HelloNative.c 用C写的一个小程序 HelloNative....
泛型可以与多态结合,允许子类继承父类的泛型方法,并自定义类型参数。这增强了代码的灵活性和扩展性。 通过上述的讲解和实践,我们可以更好地理解和运用泛型编程,提升代码的质量和效率,减少潜在的类型错误。在...
协变返回类型允许子类覆盖父类的方法时,返回类型可以是父类返回类型的子类型,这在泛型上下文中尤为重要,能够保持代码的灵活性和类型安全性。 #### 六、泛型的实际应用与注意事项 在实际编程中,合理运用泛型...
例如,一个通用的交换两个元素的方法可以声明为`public static <T> void swap(T[] arr, int i, int j)`,这里的T是方法的泛型参数,允许传入任何类型的数组。 4. **泛型通配符**: 在处理多种类型但又不想为每种...
泛型同样支持子类继承。例如,如果有一个 `List<Number>`,那么 `List<Integer>` 可以被视为它的子类,这是因为 Integer 是 Number 的子类。然而,这种关系并非总是直觉上的那么简单,特别是当涉及到类型转换和实例...
泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数。类型参数类似于函数参数,但它们代表的是类型而不是值。例如,`List<T>`中的`T`就是一个类型参数,`T`代表某种具体的类型,如`String`、`...
如果子类中定义了一个与父类中相同名称、相同返回类型且参数列表完全相同的方法,那么就认为是重写了父类的方法。重写主要用于子类扩展父类的功能,使得子类具有不同的行为。需要注意的是,重写的方法必须保持与被...
- 如果子类没有指定类型参数,那么子类默认继承父类的无界类型参数,如`class DerivedBox extends Box {...}`相当于`class DerivedBox extends Box<Object> {...}`。 7. **泛型与实例化** - 泛型类的实例化必须...
继承允许子类继承父类的属性和方法,实现代码的复用。多态是指一个接口或父类引用可以指向不同子类的对象,实现动态绑定。组合是将一个对象作为另一个对象的成员变量,实现复杂对象的构建。代理模式则提供了在运行时...
继承则允许子类继承父类的属性和方法,实现代码重用。多态性意味着一个接口可以有多种不同的实现,这在处理不同类型的对象时非常有用。 在"Java应用编程100例"中,可能包含以下主题: 1. 基本语法:如变量声明、...
Java 泛型(Java Generics)是一种类型参数化机制,用于定义类型安全的类和方法。泛型可以提高代码的可读性和可维护性。 日期处理 Java 提供了多种日期处理类,如 Date、Calendar、LocalDateTime 等,用于处理日期...
4. **继承**:继承允许子类继承父类的属性和方法,提高了代码的复用性。Java中的继承使用`extends`关键字来实现,单继承是其特性,即一个类只能有一个直接父类。 5. **多态**:多态允许不同类型的对象对同一消息...
继承允许子类继承父类的方法和属性,同时可以重写父类的方法,从而实现多态;而接口则允许不同的类通过实现同一个接口来达到多态的效果。在 Java 中,多态性是通过方法重写和方法重载来实现的。方法重写是指子类提供...
11. **扩展类(Extending Class)**:通过`class SubClass extends SuperClass`的形式,子类可以继承父类的属性和方法。 12. **多态(Polymorphism)**:Java中的多态性是指对象变量可以指向多种类型的实例,允许...