将通用对象与整数进行比较

Iva*_*dir 1 java generics

在处理我的项目时,我创建了一个函数来从中选择一个随机对象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).minlist.get(i).max不工作.我不知道如何处理这个问题.

rge*_*man 7

您的类型参数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)