【发布时间】:2016-02-01 00:01:15
【问题描述】:
有一个方法:
public <T> T foo(Class<T> type);
当我这样称呼它时:
String s = foo(String.class);
一切都很好。这也有效:
Set s = foo(Set.class);
但是,以下内容无法编译:
Set<String> s = foo(Set.class); // compilation error
所以我用一些愚蠢的东西来修复它:
Set<?> tmp = foo(Set.class);
Set<String> s = (Set<String>) tmp;
我无法更改foo() 的签名。有没有更好的方法来完成我错过的这项任务?
编辑
出于某种奇怪的原因,我不清楚我在这里做什么。所以,foo 方法是一个需要一些输入加上Class<T> 的方法。它接受输入并创建给定类的实例。所以,foo 的真正签名可能是:
public <T> T parseStringToClass(String input, Class<T> targetClass);
而用法可能是:
Integer value = parseStringToClass("123", Integer.class);
这里没有什么不寻常的地方——对于任何解析器和转换器来说,它都是相当常见的签名。
【问题讨论】:
-
这在 Java 8 中并不是什么新鲜事,答案或多或少是“不,没有;擦除不能按您希望的方式工作。”
-
@LouisWasserman 也许你能解释一下?这不就是 SO 的目的吗?
-
@игор 在 Java 8 中你的代码 Set
s = foo(Set.class);带有警告,但已编译。