【问题标题】:Is there a workaround to java not allowing generic class arraysjava是否有解决方法不允许泛型类数组
【发布时间】:2025-11-22 03:25:03
【问题描述】:

我有一个LinkedHashMap 的页面,我有一个PageIDs 的数组。我想编写一个方法,返回在PageIDs中找到的页面数组。

问题是页面是一个泛型类。

当我写 Page<byte[]>[] pagesToReturn = new Page<byte[]>[pageIds.length]; 时,我当然会收到错误“无法创建页面的通用数组”。

当我尝试创建一个数组然后将其转换为:Page<byte[]>[] pagesToReturn = (Page<byte[]>[]) new Page[pageIds.length]; 时,我收到一条警告“类型安全:未经检查的从 Page[] 转换为 Page[]”。

我知道这是一个微妙的问题,但我必须遵守方法public Page<byte[]>[] getPages(Long[] pageIds) 的签名,它必须返回一个泛型类型为字节数组的页面数组。

是否有不包含警告抑制的解决方法?

【问题讨论】:

  • “我必须坚持签名”是你真正的问题。脑外科医生将泛型和数组放在一起的决定应该被推翻,方法签名更改为返回列表而不是数组。
  • @Bohemian 这不是我的决定。这是一个大学项目。我们不会因更改说明而获得奖励积分。
  • 您可以手动检查演员表是否安全,然后使用注释抑制警告。这是在糟糕的情况下你能做的最好的事情。
  • @Oria 好吧,你不太可能在现实生活中的商业代码中找到这样的签名
  • @Bohemian 也不错。我暂时取消警告,然后我会问教授是否可以。如果没有,我会向他请教进一步的指示。感谢大家。结束这个问题。

标签: java arrays generics


【解决方案1】:

是否有不包含警告抑制的解决方法?

没有。但是,如果程序中的其他任何地方都注意类型安全,因此Page 的数组保证包含Page<byte[]> 的实例,那么这个转换是安全的。

处理这种情况的最佳方法是取消警告,并添加注释说明强制转换是安全的,因为您知道元素保证是正确的类型。 p>

【讨论】:

    【解决方案2】:

    抑制警告如下:

    @SuppressWarning("unchecked")
    Page<byte[]>[] pagesToReturn = (Page<byte[]>[]) new Page[pageIds.length];
    

    您还可以执行以下操作:

    public class MyPage extends Page<byte[]>{
    ...
    }
    
    MyPage[] pagesToReturn = new MyPage[pageIds.length];
    

    【讨论】: