为 toArray 方法创建通用数组

Posted

技术标签:

【中文标题】为 toArray 方法创建通用数组【英文标题】:Create generic array for toArray method [duplicate] 【发布时间】:2013-07-09 20:25:39 【问题描述】:

我有以下方法:

public static <T, U> T[] getKeysForValue(Map<T,U> map,U value)
    if(map == null || map.isEmpty()) 
        return null;
    

    Set<T> keys = new HashSet<T>();

    for (Map.Entry<T,U> entry : map.entrySet()) 
        if (entry.getValue().equals(value)) 
            keys.add(entry.getKey());
        
    

    return keys.toArray(new T[keys.size()]);

我在线上遇到编译错误:keys.toArray(new T[keys.size()]),上面写着“无法创建 T 的通用数组”,这很明显。我该如何解决这个问题?

【问题讨论】:

@feralin 更长、更实用的答案会更好。 Java 泛型系统中的一些明显缺陷可以通过使用显式类型标记来解决。不幸的是,当类型参数本身被参数化时,这些都没有帮助,但这里不是这种情况。不知道如何在 Java 中做到这一点并不是拖钓的好借口。 @feralin 我在 C# 和 Java 方面拥有相同的专业知识,因此比较它们会引起很大的争议。 @millimoose 你为什么说我在拖钓?请您提供一些证据或证据吗? @feralin 您的评论至少是“答案是您的语言很烂”的近邻。看到意图不会通过互联网转移,我没有“证据”,但话又说回来,我们不在法庭上。另外,在这件事上分心是忽略了我反对的关键,那就是你的评论不是很有建设性。 【参考方案1】:

为什么不直接返回Set?无论如何,这在这种情况下似乎更有意义。

public static <T, U> Set<T> getKeysForValue(Map<T, U> map, U value) 
    ...

    return keys;

如果您仍想返回一个数组,另一种选择是将要填充的数组作为参数传递:

public static <T, U> T[] getKeysForValue(Map<T,U> map, U value, T[] dest) 
    ...

    return keys.toArray(dest);

【讨论】:

【参考方案2】:

您应该将与T 对应的类作为方法的参数传递并调用Array.newInstance(clazz, size)

public static <T, U> T[] getKeysForValue(Class<T> clazz, Map<T,U> map,U value)

  T[] array = (T[])Array.newInstance(clazz, size);

【讨论】:

不通过clazz就没有办法吗?通过在运行时确定键的类类型,我不能这样做吗? 不,因为泛型中的类型擦除,类型在运行时是未知的,所以你没有机会猜测它。在运行时,Map&lt;T,U&gt; 基本上变成了Map&lt;Object, Object&gt; +1,还有其他方法,我自己回答了。我以前应该多试几次。 :-) 可能需要@SuppressWarnings("unchecked") 如果调用者也没有 T 类(T 是调用者中的类型变量),则不会工作。我们无法通过所有 API 传递类。更好的答案是 - 不要使用数组,使用集合。

以上是关于为 toArray 方法创建通用数组的主要内容,如果未能解决你的问题,请参考以下文章

toArray方法-转载

toArray()方法使用说明

转ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组

如何在 Java 中将 list.toArray() 方法用于二维数组

关于java中的toArray()方法动态数组的运用???????

关于java中动态数组的toArray()方法的运用????