【发布时间】: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;
}
}
【问题讨论】:
-
someListOfFoos和fooWrappers使用原始类型是否有原因? -
@Tom,我希望列表包含任何类型的
Foos。 -
那么至少使用通配符。
-
查看关于类型安全异构容器的答案:stackoverflow.com/a/416611/2513200 - 基本上,只有知道类型并且可以转换为类型,才能恢复类型。
-
正确推断类型有什么好处,只是在将其添加到列表时立即将其丢弃?