我有一个实用功能,可以随机播放 任何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无法编译。
答案 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>为你工作?这应该? :)