在处理我的项目时,我创建了一个函数来从中选择一个随机对象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;
}
Run Code Online (Sandbox Code Playgroud)
这是我碰到了一个障碍,因为list.get(i).min和list.get(i).max不工作.我不知道如何处理这个问题.
您的类型参数G没有绑定,因此编译器不能假定除Object方法之外的任何方法都可用.
如果您期望max并且main可以在列表中的不同,不相关的对象上使用,那么创建一个声明此功能的接口.
interface MinMax {
int getMin();
int getMax();
}
Run Code Online (Sandbox Code Playgroud)
让所有不同的,不相关的对象实现此接口.然后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;
}
Run Code Online (Sandbox Code Playgroud)
您也可以决定编程到界面并接受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;
}
Run Code Online (Sandbox Code Playgroud)