如果我正在为通用类编写包装器,则我尝试将其嵌入到构造中(如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实例的列表,我想将它们转换成FooWrapper的列表,方法如下:

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


构建每个someListOfFoos时,有什么方法可以恢复FooWrapper中每个元素的类型?遵循以下原则:

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;
    }
}

最佳答案

您只需引入一个泛型即可稍微修改FooWrapper#from

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

10-08 11:43