【问题标题】:How wrap a generic class in java如何在java中包装一个泛型类
【发布时间】:2019-04-09 17:47:46
【问题描述】:

如果我正在为一个泛型类编写一个包装器,我试图将类型嵌入到构造中(如this SO question):

class Foo<T> {
    private T value;
    private Class<T> type;

    public Foo(Class<T> type, T value) {
        this.value = value;
        this.type = type;
    }

    public T getValue() {
        return value;
    }

    public Class<T> getType() {
        return type;
    }
}

我有一个Foo 的实例列表,我想将其转换为FooWrappers 的列表,如下所示:

List<Foo<?>> someListOfFoos = ...
List<FooWrapper<?>> fooWrappers = someListOfFoos
    .stream()
    .map(foo -> FooWrapper.from(foo))
    .collect(Collectors.toList());

在构建每个FooWrapper 时,有什么方法可以恢复someListOfFoos 中每个元素的类型?大致如下:

class FooWrapper<T> {
    private Foo<T> foo;

    public static FooWrapper<?> from(Foo<?> toWrap) {
        Class<E> type = toWrap.getType(); // i know this is wrong
        return new FooWrapper<type>(toWrap); // this is very wrong
    }

    private FooWrapper(Foo<T> foo) {
        this.foo = foo;
    }
}

【问题讨论】:

  • someListOfFoosfooWrappers 使用原始类型是否有原因?
  • @Tom,我希望列表包含任何类型的 Foos。
  • 那么至少使用通配符。
  • 查看关于类型安全异构容器的答案:stackoverflow.com/a/416611/2513200 - 基本上,只有知道类型并且可以转换为类型,才能恢复类型。
  • 正确推断类型有什么好处,只是在将其添加到列表时立即将其丢弃?

标签: java generics


【解决方案1】:

你只需要稍微修改你的FooWrapper#from,引入一个泛型:

public static <E> FooWrapper<E> from(Foo<E> toWrap) {
    return new FooWrapper<E>(toWrap);
}

【讨论】:

    猜你喜欢
    • 2014-08-02
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多