gpt4 book ai didi

java - 为什么使用工厂方法时 TypeToken 无法捕获泛型类型?

转载 作者:行者123 更新时间:2023-11-30 07:18:10 25 4
gpt4 key购买 nike

跟进How to use TypeToken to get type parameter? ,似乎如果我使用工厂方法实例化一个类,则 TypeToken 不再能够捕获泛型类型参数。

import com.google.common.reflect.TypeToken;

public class Test<E extends Enum<E>> {

private static enum MyEnum {
FIRST,
SECOND
};

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};

public static void main(String[] args) {
Test<MyEnum> container = new Test<MyEnum>() {
};
System.out.println("constructor: " + container.enumType.getRawType());
System.out.println("factory : " + build(MyEnum.class).enumType.getRawType());
}

public static <E extends Enum<E>> Test<E> build(Class<E> type) {
return new Test<E>() {
};
}
}

上面的示例输出:

constructor: class Test$MyEnum
factory : class java.lang.Enum

为什么这不起作用?可以修复吗?

最佳答案

鉴于没有人愿意将他们的评论转换为正式答案,我将继续这样做:

previously discussed ,Java仅保留有关泛型父类(super class)的类型参数的信息。由于类型参数与方法(而不是父类(super class))关联,因此运行时值 <E>不保留。将工厂方法替换为

public static Test<MyEnum> of() {
return new Test<MyEnum>() {
};
}

将产生正确的值,但显然这违背了工厂方法的目的,因为我们被迫使用硬编码的枚举类型。

回顾一下,TypeToken不会在这里工作。保留有关类型参数的信息的唯一方法是传递 Class<E>如下:

public class Test<E extends Enum<E>> {

private static enum MyEnum {
FIRST,
SECOND
};

private final Class<E> type;

public Test(Class<E> type) {
this.type = type;
}

public static void main(String[] args) {
Test<MyEnum> container = new Test<>(MyEnum.class);
System.out.println(container.type);
System.out.println(of(MyEnum.class).type);
}

public static <E extends Enum<E>> Test<E> of(Class<E> type) {
return new Test<>(type);
}
}

关于java - 为什么使用工厂方法时 TypeToken 无法捕获泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com