Java之getGenericSuperclass方法简解

目录

getGenericSuperclass方法简解

定义一个含泛型父类Father

定义一个继承了含泛型父类的子类Son

测试各种方法打印效果

getClass(自身类)

getSuperclass(父类)

getGenericSuperclass(带有泛型的父类,原返回值类型为Type,需要强转类型)

getActualTypeArguments(泛型类)


getGenericSuperclass方法简解

  • 定义一个含泛型父类Father<T>

package com.mark.test;

public class Father<T> {

}
  • 定义一个继承了含泛型父类的子类Son

public class Son extends Father<Son> {

}
  • 测试各种方法打印效果

public class ClassTest {
	
	@Test
	public void test(){
		Son son = new Son();
		Class clazz = son.getClass();
		System.out.println("---Son extends Father<Son>---");
		System.out.println("自己类:" + clazz);
		System.out.println("父类:" + clazz.getSuperclass());
		System.out.println("带有泛型的父类:" + clazz.getGenericSuperclass());
		
		//ParameterizedType参数化类型,即泛型 
		ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();
		Type type = pt.getActualTypeArguments()[0];
		System.out.println("强转类型后获得<T>类型:" + type);
	}
}
---Son extends Father<Son>---
自己类                 :class com.mark.test.Son
父类                   :class com.mark.test.Father
带有泛型的父类          :com.mark.test.Father<com.mark.test.Son>
强转类型后获得<T>类型   :class com.mark.test.Son

getClass(自身类)

getSuperclass(父类)

getGenericSuperclass(带有泛型的父类,原返回值类型为Type,需要强转类型)

//ParameterizedType参数化类型,即泛型 
           ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();

getActualTypeArguments(泛型类)

    Type type = pt.getActualTypeArguments()[0];

Java中定义和使用带有泛型类型 `T` 的方法是泛型编程的核心内容之一。通过泛型方法,可以编写出更加通用、类型安全的代码,适用于多种数据类型而无需进行强制类型转换。 ### 定义泛型方法 泛型方法可以在类内部定义,也可以在接口中定义。其基本语法如下: ```java public <T> T methodName(T parameter) { // 方法体 } ``` 其中 `<T>` 表示类型参数声明,紧随其后的是返回类型 `T` 和参数类型 `T`。类型参数 `T` 可以在整个方法体内作为占位符使用,表示任意具体的类型。 例如,定义一个简单的泛型方法来返回传入的对象: ```java public <T> T identity(T value) { return value; } ``` 调用时可以指定具体类型或由编译器自动推断类型: ```java String result1 = identity("Hello"); Integer result2 = identity(42); ``` ### 使用泛型方法与泛型约束 有时希望对泛型方法中的类型 `T` 施加限制,比如要求 `T` 必须实现某个接口或继承某个类。这种情况下可以使用**有界类型参数(bounded type parameters)**。 例如,定义一个泛型方法,要求传入的类型必须是 `Comparable<T>` 的子类型: ```java public <T extends Comparable<T>> T max(T a, T b) { return a.compareTo(b) > 0 ? a : b; } ``` 该方法可以用于 `Integer`、`String` 等实现了 `Comparable` 接口的类型[^3]。 ### 泛型方法与自限定类型(Self-Bounding) 自限定类型是一种高级泛型技巧,允许将类型参数限制为当前类本身的一个子类型。它通常用于确保类型安全和增强链式调用能力。 例如: ```java public class SelfBounded<T extends SelfBounded<T>> { T self; public T set(T arg) { self = arg; return self; } public T get() { return self; } } ``` 这样可以保证 `set()` 返回的类型是调用者的实际类型,而不是基类类型[^3]。 ### 桥接方法与泛型擦除 Java 的泛型是通过类型擦除实现的,这意味着在运行时泛型信息会被擦除。为了保持多态行为,编译器会生成**桥接方法(bridge methods)**。 例如,在使用泛型类时,可能会生成类似如下的桥接方法: ```java public class MyList implements List<String> { // 编译器会生成桥接方法来支持多态 } ``` 这些桥接方法的存在是为了确保泛型类在运行时仍然能够正确地支持多态调用[^2]。 ### 获取泛型类型信息 由于 Java 的类型擦除机制,直接获取泛型参数的实际类型并不容易。但可以通过 `Class.getGenericSuperclass()` 方法结合 `ParameterizedType` 来获取父类的泛型参数类型。 例如: ```java Type superclass = obj.getClass().getGenericSuperclass(); if (superclass instanceof ParameterizedType) { Type[] args = ((ParameterizedType) superclass).getActualTypeArguments(); Class<?> genericType = (Class<?>) args[0]; } ``` 这种方式常用于框架设计中,用于动态解析泛型信息[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值