2016-04-19 6 views
0

これは私が探していたものを正確に返答するものが見つからないことを望んでいます。

大規模なマップを作成する際に繰り返されるコードがあります。
コードの異なるチャンク間の唯一の違いは、ループスルーされているクラスです。リユース拡張ループFor別のクラスタイプ

例:

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

答えて

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

@AndyTurner:うん、確かに良い。私はどこにいたのですか? :-) –

1

工ass、AnotherClass、AndAnotherClassなどは、すべての実装であろうとのインタフェース(SomeInterface)を作成します。このインタフェースは、あなたがそれからできた

getXYZ()setXYZ()を持っているでしょう:

for (SomeInterface class : SomeClassList) { 
     class.getXYZ(); 
} 
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 :(

3番目: 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(); 
    } 
} 
関連する問題