2017-11-22 22 views
1

Javaのジェネリック - 有界型パラメータ

class Base { 
    public void sayHi() { 
    System.out.println("Hi"); 
    } 
} 

class ChildOne extends Base { 
    public void sayBye() { 
    System.out.println("Bye-1"); 
    } 
} 

class ChildTwo extends Base { 
    public void sayBye() { 
    System.out.println("Bye-2"); 
    } 
} 

public class MainClass { 
    public static <T extends Base> void genericFunction(T child) { 
    child.sayBye(); 
    } 

    public static void main(String[] args) { 
    ChildOne childOne = new ChildOne(); 
    ChildTwo childTwo = new ChildTwo(); 
    genericFunction(childOne); 
    genericFunction(childTwo); 
    } 

} 

このコードが間違っている、私は一例で私の意図を説明してみましょう。しかし私の意図は、子クラス(既にプロジェクト内に存在するいくつかのクラス)で、それらの間に同様のプロパティを持ち、基本クラスを拡張し、sayBye()メンバー関数を持っています。

すべての子クラスをパラメータとして汎用関数に渡し、メンバー関数sayBye()を呼び出す方法はありますか(この例のように)?

+4

いいえ、現在のコード構造を使用していません。 2つの子の「sayBye」メソッドは、お互いに全く関係がありません。彼らが同じ名前を持っているという事実は重要ではありません、それはただの "偶然"です。関数をBaseクラスに移動し、抽象クラスにし、それをChildクラスに実装する必要があります。 – luk2302

+0

なぜ彼らはインターフェイスを実装していないのですか? – MrHug

+0

'sayBye()'メソッドは 'ChildOne'とそのサブクラスで利用できます。署名を 'void genericFunction(ChildOne child)'に変更します。または、@ MurHugが示唆しているように、必要なメソッドをインターフェイスに配置します。 – Strikegently

答えて

4

確かに、sayByeメソッドを持つすべてのクラスの共通基本クラスまたは共通インターフェイスを作成できます。

public static <T extends CommonInterface> void genericFunction(T child) { 
    child.sayBye(); 
} 

またはジェネリックなし::

次に、あなたがあなたのジェネリック型パラメータのバインドタイプに変更することができます

public static void nonGenericFunction(CommonInterface child) { 
    child.sayBye(); 
} 
0

をあなたはそのインターフェイスを導入することによって、階層を調整することなく、一緒に共通の機能をもたらすことができますそれを定義し、共通オブジェクトを拡張する空のクラスを作成します。

class Base { 
    public void sayHi() { 
     System.out.println("Hi"); 
    } 
} 

class ChildOne extends Base { 
    public void sayBye() { 
     System.out.println("Bye-1"); 
    } 
} 

class ChildTwo extends Base { 
    public void sayBye() { 
     System.out.println("Bye-2"); 
    } 
} 

// The common functionality I want to use. 
interface Bye { 
    public void sayBye(); 
} 

class ChildOneBye extends ChildOne implements Bye { 
    // Don't need anything here. 
} 

class ChildTwoBye extends ChildTwo implements Bye { 
    // Don't need anything here. 
} 

public static <T extends Bye> void genericFunction(T child) { 
    child.sayBye(); 
} 

public void test(String[] args) { 
    Bye childOne = new ChildOneBye(); 
    Bye childTwo = new ChildTwoBye(); 
    genericFunction(childOne); 
    genericFunction(childTwo); 
} 
関連する問題