我需要将 Map 的每个条目表示为类型 T,但我不知道该怎么做。
这是入口集的定义:
public Set<Map.Entry<K,V>> entrySet()
所以我需要这样的东西:
Map<?,?> -> Set<T>
这将编译:
public static <T, E> void Each(Map i, IEacher<T, E> m, Asyncc.IEachCallback<E> f) {
NeoEach.Each(Integer.MAX_VALUE, i.<T>entrySet(), m, f);
}
但我收到警告:
Unchecked assignment: 'java.util.Set' to 'java.lang.Iterable'. Reason: 'i' has raw type, so result of entrySet is erased
但奇怪的是,这不会编译:
public static <T, E> void Each(Map<Object,Object> i, IEacher<T, E> m, Asyncc.IEachCallback<E> f) {
NeoEach.Each(Integer.MAX_VALUE, i.<T>entrySet(), m, f);
}
使用 Map i
编译,但是 Map<Object,Object> i
它不会说:
预期:
i:java.lang.Iterable<T>
实际:
i.<T>entrySet() (java...java.lang.Object,java.lang.Object>>)
最佳答案
你的 NeoEach.Each
方法接受 Iterable<T>
但您试图强制它使用 Map<Object,T>
的条目集.这在我看来有些模棱两可。该方法应该用 Map.Entry
做什么比 T
更好本身?如果您在 Each
中使用映射键方法,在那里传递条目集而不是 Iterable
或通过 Iterable
条目数:
static <T, E> void Each(int limit, Iterable<Map.Entry<Object,T>> i, Asyncc.IEacher<T, E> m, Asyncc.IEachCallback<E> f) {
在极端情况下,可能会进行一些反射或基于代理的黑客攻击来伪造 Map.Entry
看起来像T
但我相信那不是你我真正想要的。
编辑:
编译给你的并不意味着它会运行。声明原始 Map
只是掩盖问题,并没有解决问题。治疗rawtype的尝试Map.Entry
因为值类型将在 ClassCastException
上失败有时在未来。
关于java - 将 Map 的条目集表示为类型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836064/