在处理项目时,我创建了一个函数,用于从ArrayList
中选择一个随机对象。每个对象都有一个变量min和max,该变量定义了对象被选择的百分比。
该函数运行完美,但是我使用了十二个细微的变化,因为我有很多ArrayList
带有不同类型的对象,需要在其上使用它。因此,我想使其通用,这样我只能使用该函数的一个变体,我可以将其用于所有列表。此刻,我有这个:
public static <G> int selRan(ArrayList<G> list){
int sel = 0;
Random rand = new Random();
int randNum = rand.nextInt(100) + 1;
for(int i = 0; i < list.size(); i++){
if(list.get(i).min <= randNum && randNum < list.get(i).max){
sel = i;
}
}
return sel;
}
这是我遇到的障碍,因为list.get(i).min
和list.get(i).max
不起作用。我不知道如何解决这个问题。
答案 0 :(得分:7)
您的类型参数G
没有限制,因此编译器无法假定除Object
方法以外的任何方法均可用。
如果您希望max
和main
在列表中不同的不相关对象上可用,请创建一个声明此功能的接口。
interface MinMax {
int getMin();
int getMax();
}
让您所有不同的不相关对象都可以实现此接口。然后声明G
,上限为MinMax
(或您决定调用的任何名称),以确保可以调用这些方法。
// Declare upper bound here.
public static <G extends MinMax> int selRan(ArrayList<G> list){
int sel = 0;
Random rand = new Random();
int randNum = rand.nextInt(100) + 1;
for(int i = 0; i < list.size(); i++){
// Call interface methods here.
if(list.get(i).getMin() <= randNum && randNum < list.get(i).getMax()){
sel = i;
}
}
return sel;
}
为了灵活性,您可能还决定对接口进行编程并接受List<G>
而不是ArrayList<G>
。
您可能会发现只可以使用带边界的通配符,因为G
的确切类型无关紧要。
public static int selRan(List<? extends MinMax> list){
int sel = 0;
Random rand = new Random();
int randNum = rand.nextInt(100) + 1;
for(int i = 0; i < list.size(); i++){
// Call interface methods here.
if(list.get(i).getMin() <= randNum && randNum < list.get(i).getMax()){
sel = i;
}
}
return sel;
}