我希望这不是一个重复,因为我找不到任何回答我正在寻找的东西。
我有一大堆代码在填充大型地图时重复。
不同代码块之间的唯一区别是循环的类。
示例:
for (SomeClass class : SomeClassList) {
// Repeated code here.
}
for (AnotherClass aClass : AnotherClassList) {
// Repeated code here.
}
for (AndAnotherClass fClass : AndAnotherClassList) {
// Repeated code here.
}
etc...
所有这些类共享两种方法getXYZ()
和setXYZ()
。我曾尝试使用泛型,但多种类型都失败了。我想创建一个方法,我可以传入不同类的不同列表,在不同的列表上执行相同的代码。
这样的事情:
public void anyList(List<?> list){
for(classOfList item: list){
//code here
}
}
答案 0 :(得分:5)
如果它们是您的类,请将getXYZ
和setXYZ
放在它们全部实现的接口中(直接或从基类等),然后使用该接口作为您的类型增强的for
循环。
interface HasXYZ {
void setXYZ(XYZType xyz);
XYZType getXYZ();
}
class SomeClass implements HasXYZ {
// ...
}
class AnotherClass implements HasXYZ {
// ...
}
class AndAnotherClass implements HasXYZ {
// ...
}
然后是您的anyList
:
public void anyList(List<HasXYZ> list){
for (HasXYZ item : list){
// code here
}
}
然后:
anyList(someClassList);
anyList(anotherClassList);
anyList(andAnotherClassList);
答案 1 :(得分:1)
创建SomeClass,AnotherClass,AndAnotherClass等都将实现的接口(SomeInterface)。此界面上有getXYZ()
和setXYZ()
然后你可以:
for (SomeInterface class : SomeClassList) {
class.getXYZ();
}
答案 2 :(得分:0)
这有几个部分。
首先:创建一个接口(或基类)
public interface SomeInterface {
void someMethod();
}
public class SomeClass implements SomeInterface {
public void someMethod() {
// do something
}
}
public class SomeOtherClass implements SomeInterface {
public void someMethod() {
// do something
}
}
第二:您可以在界面(或基类)的列表上调用someMethod
public void callSomeMethod(List<SomeInterface> things) {
for (SomeInterface someInterface : things) {
someInterface.someMethod();
}
}
List<SomeInterface> someInterfaceList = //make some list
callSomeMethod(someInterfaceList); //This Works!!!
List<SomeClass> someClassList = //make some list
callSomeMethod(someClassList); //This is an error :(
第三:如果您需要使用SomeClass或SomeOtherClass的列表
,则为泛型// I prefer the explicit type
public <T extends SomeInterface> void callSomeMethod(List<T> things) {
for (T t : things) {
t.someMethod();
}
}
// This works as well
public void callSomeMethod(List<? extends SomeInterface> things) {
for (SomeInterface t : things) {
t.someMethod();
}
}