重用增强的循环不同类类型

时间:2016-04-19 15:49:05

标签: java generics for-loop

我希望这不是一个重复,因为我找不到任何回答我正在寻找的东西。

我有一大堆代码在填充大型地图时重复。
不同代码块之间的唯一区别是循环的类。

示例:

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

3 个答案:

答案 0 :(得分:5)

如果它们是您的类,请将getXYZsetXYZ放在它们全部实现的接口中(直接或从基类等),然后使用该接口作为您的类型增强的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();
    }
}