【发布时间】:2024-01-19 14:00:01
【问题描述】:
我遇到了一个我无法找到解决方案的问题。
我经常使用映射,其中键和值是具有匹配泛型类型的对象。对于每一对,泛型应该匹配。尽管条目之间的泛型类型可能会有所不同。 (为了清楚起见,我会举一个例子)。 这可以通过使用通配符轻松完成。虽然正因为如此,您不能将键或值组合使用。
考虑底部的示例。没有(简单的)方法可以修改映射以遇到 Cast 异常。虽然我仍然无法像在useEntries() 中尝试过的那样使用地图。所以我的问题是,是否有解决方法?提前致谢!
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;
}
}
}
【问题讨论】:
-
强制转换是一种明显的解决方法。
-
我对您的帖子和您的要求感到困惑。您正在使用泛型和通配符。我建议完整阅读本教程,它涵盖了泛型和通配符,并将阐明您的问题。 The Java™ Tutorials: Generics (Updated)
-
@shmosel 你可能根本没有尝试投射这个?因为它不起作用。我什至尝试用自己的通用实现创建一个私有方法。但它相当简单。泛型类型可以转换为通配符,但不能转换为 vicaversa
-
我想你的意思是
apply(currentEntry.getKey().get())。否则它需要是Function<GenericObject<S>, S>。 -
currentEntry.getKey()返回一个GenericObject<?>,这意味着编译器完全不知道?是什么。为了保证你没有做错,它只允许你设置它知道是合法的,这完全没有。或者你能在不知道?是什么的情况下推断出?的相等或子类型吗?为什么您的地图不是(非静态)HashMap<GenericObject<S>, ...>在本身类型为<S>的类中?那会奏效的。
标签: java generics casting wildcard classcastexception