我遇到了一个问题,我无法找到解决方案。泛型通配符不能转换为泛型
我经常使用一个映射,其中键和值是具有匹配泛型类型的对象。对于每一对泛型应匹配。虽然条目之间的泛型可能不一样。 (为了清楚起见,包括一个例子)。 这可以通过使用通配符来轻松完成。虽然正因为如此,你不能将钥匙或价值与海誓山盟结合使用。
请考虑底部包含的示例。没有(简单的)方法来修改映射以运行到Cast异常。虽然我仍然无法使用地图,就像我在useEntries()
内尝试的那样。所以我的问题是,有没有解决这个问题的方法?提前致谢!
@SuppressWarnings("unchecked")
public static void useEntries() {
for (Map.Entry<GenericObject<?>, Function<?, ?>> currentEntry : map.entrySet()) {
GenericObject key = currentEntry.getKey();
Function value = currentEntry.getValue();
key.set(value.apply(key.get()));
}
}
去除方法中GenericObject
和Function
仿制药将让你做出纯Object
实例调用:
public class GenericWildcardTest
{
static Map<GenericObject<?>, Function<?, ?>> map = new HashMap<>();
public static <S> void put(GenericObject<S> genericObject, Function<S, S> function)
{
map.put(genericObject, function);
}
public static void useEntries()
{
for(Entry<GenericObject<?>, Function<?, ?>> currentEntry : map.entrySet())
//The #apply(); part simply wont compile because of cast errors.
currentEntry.getKey().set(currentEntry.getValue().apply(currentEntry.getKey().get()));
}
// Simple Object with generic.
static class GenericObject<T>
{
private T object;
public GenericObject(T object)
{
this.object = object;
}
public void set(T object)
{
this.object = object;
}
public T get()
{
return this.object;
}
}
}
铸造是一个明显的解决方法。 – shmosel
我很困惑你的帖子和你的要求。您正在使用泛型和通配符。我建议您完整阅读本教程,其中涵盖了泛型和通配符,并将阐明您的问题。 [Java™教程:泛型(更新)](http://docs.oracle.com/javase/tutorial/java/generics/index.html) – Underbalanced
@shmosel你明智地没有尝试使用它?因为它不会工作。我甚至试图用自己的通用实现来制作私有方法。但其相当简单。泛型可以转换为通配符,但不是vicaversa – n247s