如何避免泛型警告

时间:2011-02-21 22:31:37

标签: java generics

我有一个实用功能,可以随机播放 任何Vector的元素,但生成泛型 关于使用原始类型的警告。

static public void shuffle(Random r,Vector v)
   {    int sz = v.size();
        for(int pass = 0;pass<4;pass++)
        {   for(int i=0;i<sz;i++)
            { int j=nextInt(r,sz);
              Object ii = v.elementAt(i);
              v.setElementAt(v.elementAt(j),i);
              v.setElementAt(ii,j);
            }
        }
  }

似乎没有办法安静除了之外的警告 抑制它们。将方法签名更改为Vector<Object> 限制来电者Vector<Object>。更改为Vector<?>会使 setElementAt无法编译。

3 个答案:

答案 0 :(得分:8)

首先你应该注意到你正在重新发明轮子。

Collections.shuffle (yourVector, yourRandom);

诀窍: - )


为了使您的方法适用于所有类型的Vector,这是编写它的方法:

static public <T> void shuffle(Random r, Vector<T> v) {
    int sz = v.size();
    for (int pass = 0; pass < 4; pass++) {
        for (int i = 0; i < sz; i++) {
            int j = nextInt(r, sz);
            T ii = v.elementAt(i);
            v.setElementAt(v.elementAt(j), i);
            v.setElementAt(ii, j);
        }
    }
},

答案 1 :(得分:3)

正如已经指出的那样,你可以这样做泛型:

public static <T> void privateShuffle(Random r, Vector<T> v) {
    int sz = v.size();
    for (int pass = 0; pass < 4; pass++) {
        for (int i = 0; i < sz; i++) {
            int j=nextInt(r,sz);
            T ii = v.elementAt(i);
            v.setElementAt(v.elementAt(j), i);
            v.setElementAt(ii, j);
        }
    }
}

但是,由于你正在编写一个实用工具方法,我更喜欢?通配符语法 - 看起来要清晰得多。正如您已经注意到的那样,您不能直接在该方法上使用以下标题,但我很想做类似以下的事情:

public static void shuffle(Random r, Vector<?> v) {
    privateShuffle(r, v);
}

private static <T> void privateShuffle(Random r, Vector<T> v) {
    int sz = v.size();
    for (int pass = 0; pass < 4; pass++) {
        for (int i = 0; i < sz; i++) {
            int j=nextInt(r,sz);
            T ii = v.elementAt(i);
            v.setElementAt(v.elementAt(j), i);
            v.setElementAt(ii, j);
        }
    }
}

是的,这是一个额外的方法,但是这样你就可以暴露无界通配符的“干净的API”外观,同时仍然保持类型的安全性(这是许多Java API方法的工作原理。)

作为旁注,我还会重复这一点,除非你出于传统原因这样做,Vector现在通常被认为是一个过时的集合,更好的选择是使用一个列表(和代码来列表界面。)

答案 2 :(得分:0)

您可以使用supresswarning注释

@SuppressWarnings("unchecked")

编辑:为什么矢量&lt; T>为你工作?这应该? :)