java - 将 Map 的条目集表示为类型 T

标签 java

我需要将 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/

相关文章:

java - Spring - 从 JUnit 和 Maven 运行时的不同测试结果

Java ASN.1 编译器

java - Java 中的 Scala 对象

java - 将base64中的图像从rest服务返回到img src标签

java - 当App后台震动方法不起作用时

Java:如何创建一个通过交换字符对来加密行的程序?

java - Java中的无序对

java.lang.IllegalArgumentException : Cannot find a factory to create the request context

java - 如何在包含 Magisk 应用程序的 root 设备中限制我的 Android 应用程序?

java - 创建多个 JButton(数百个)会在创建它们时产生巨大的延迟