Java中如何对泛型类型T使用class关键字?
解决泛型方法中使用
T.class的问题 直接在泛型方法里写T.class会编译报错,这是因为Java泛型的类型擦除机制:编译完成后,泛型类型参数<T>会被擦除成它的上界(默认是Object),运行时根本不存在T这个具体类型,自然无法获取它的Class对象。
要实现你想要的逻辑,必须手动把Class<T>作为参数传入方法,具体步骤如下:
1. 修改方法签名,添加Class<T>参数
把方法定义改成:
public <T> T getW(Class<T> clazz)
2. 替换代码中的T.class为传入的clazz
修改流操作里的相关代码,用传入的clazz代替T.class:
import java.util.Arrays; public class BaseTag { public <T> T getW(Class<T> clazz) { String[] arr = {"A", "B", "C"}; return Arrays.stream(arr) // 过滤逻辑可以写成这样 .filter(arg -> clazz.isAssignableFrom(arg.getClass())) .map(clazz::cast) .findFirst() .orElse(null); } }
3. 调用方法时传入具体的Class对象
比如要获取String类型的结果,调用方式为:
BaseTag tag = new BaseTag(); String result = tag.getW(String.class);
额外说明:有界泛型的情况
如果你的泛型有上界限制(比如<T extends Number>),可以在方法参数里加上类型约束,避免传入不合法的Class:
public <T extends Number> T getNumber(Class<T> clazz) { // 逻辑代码 }
内容的提问来源于stack exchange,提问作者John Friday
相关产品推荐
相关产品推荐

