通用方法参数 - Java

yon*_*awa 13 java generics collections generic-collections

我有两个几乎相同的方法,但我试图避免代码重复.

它们中的每一个都将一个唯一的对象作为参数,并从中找出最高的值.

这是一个例子:

public Integer getHighestIndexValue(List<ObjectA> list) {
    int highestValue;
    List<Integer> indexes = new ArrayList<Integer>();
    for (ObjectA a: list) {
        indexes.add(Integer.parseInt(a.getA()));
    }
    highestValue = Collections.max(indexes);

    return highestValue;

} 
Run Code Online (Sandbox Code Playgroud)

要么:

public Integer getHighestIndexValue(List<ObjectB> list) {
    int highestValue;
    List<Integer> indexes = new ArrayList<Integer>();
    for (ObjectB b: list) {
        indexes.add(Integer.parseInt(b.getB()));
    }
    highestValue = Collections.max(indexes);

    return highestValue;

}  
Run Code Online (Sandbox Code Playgroud)

如何使用通用参数组合这两个?

我尝试创建一个BaseClass包含这两个类并在方法签名中扩展它的类.还是需要铸造.

public <T extends BaseClass> Integer getHighestIndexValue(List<T> objectList) {
    int highestValue;
    List<Integer> indexes = new ArrayList<Integer>();

    for (T objects: objectList) {
        indexes.add(Integer.parseInt(objects.getAorB())); ------ this line needs casting
    }
    highestValue = Collections.max(indexes);

    return highestValue;

}
Run Code Online (Sandbox Code Playgroud)

我之前使用过Generics但尚未使用泛型参数.

有办法解决这个问题吗?

Ram*_*man 28

getAgetB被合并成一个单一的接口方法?

例如:

interface ProvidesIndex {
  Integer getIndex();
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以简单地调用getIndex,您的方法签名将是:

public Integer getHighestIndexValue(List<? extends ProvidesIndex> list) 
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果您定义要扩展的接口,Comparable<ProvidesIndex>即:

interface ProvidesIndex extends Comparable<ProvidesIndex>
Run Code Online (Sandbox Code Playgroud)

然后你可以Collections.max直接在初始列表上使用:

List<ProvidesIndex> list = new ArrayList<ProvidesIndex>();
list.add(new ObjectA());
list.add(new ObjectB());
Integer max = Collections.max(list).getIndex();
Run Code Online (Sandbox Code Playgroud)

  • 同意; 因为方法名称不同,使用泛型不能解决您的问题.ObjectA和ObjectB需要有一些通用的接口. (2认同)