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
能getA和getB被合并成一个单一的接口方法?
例如:
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)