通用接口数组

时间:2010-10-20 05:40:14

标签: java generics

我们可以在java中创建通用接口数组吗?

interface Sample<T>{}

在其他班级

Sample<T> s[] = new Sample[2] ; // for this it shows warning

Sample<T> s[] = new Sample<T>[2];// for this it shows error

1 个答案:

答案 0 :(得分:3)

不幸的是,Java不支持创建通用数组。我不知道确切的原因。实际上泛型仅在编译时存在,并且在运行javac时被删除,即从.java移动到.class。但要理解这个限制是不够的。可能他们对此类功能存在一些向后兼容性问题。

以下是您可以使用的解决方法。

  1. 使用集合(例如list)而不是数组。

    List<Sameple> list = new ArrayList<Sameple>(); // this is OK and typesafe
    
  2. 创建没有泛型的数组,将代码放入使用@SuppressWarnings注释的特殊工厂方法中:

    public class Test {
        interface Sample<T>{}
        @SuppressWarnings("unchecked")
        public static <T> Sample<T>[] sampleArray() {
            return new Sample[2];
        }
    }
    
  3. 现在您可以使用此工厂方法,而无需任何其他警告。

    一般提示。

    禁止警告是不好的做法。警告是潜在的问题。因此,如果我必须禁止警告,我至少会尝试减少警告被抑制的范围。 遗憾的是,旧版Java API不支持泛型。我们经常在使用此类API时收到警告。我总是试图将这些用法本地化为特殊类或至少像sampelArray()这样的方法。这些方法由@SuppressWarning标记,并且通常包含解释为何在此处抑制警告的注释。