比较通用对象和整数

时间:2018-06-25 18:21:31

标签: 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;
}

这是我遇到的障碍,因为list.get(i).minlist.get(i).max不起作用。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:7)

您的类型参数G没有限制,因此编译器无法假定除Object方法以外的任何方法均可用。

如果您希望maxmain在列表中不同的不相关对象上可用,请创建一个声明此功能的接口。

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;
}