2017-06-30 15 views
0

同様のメソッドを持つ2つのクラスAとBがあります。クラスオブジェクトのいずれかを引数として取り、そのクラスのメソッドを呼び出すことができるジェネリックメソッドを書く方法。Javaの引数としてオブジェクトを持つ汎用メソッド

編集:クラスA、Bを制御できません。引数としてのみ取得します。だから私はそれらを追加変更することはできません。 2つのクラスが共通のインターフェースを実装していない場合は

public class methods { 

    public static void main(String[] args) { 
     new methods().getName(new B()); 
     new methods().getName(new A()); 
    } 

    private <T> void getName(T obj){ 
     // obj.getName() 
    } 
} 

class A { 

    String name = "ClassA"; 

    public void getName(){ 
     System.out.println(name); 
    } 

} 

class B { 

    String name = "ClassB"; 

    public void getName(){ 
     System.out.println(name); 
    } 

} 
+1

インターフェイスへのプログラム。 –

+5

AとBを共通のインタフェースを実装し、そのインタフェースをメソッドの引数として使用します。これは単なる多型です。それにはジェネリックスは必要ありません。 –

+0

編集後:反映のみがそれを行うことができます。コンパイラがそのようなオブジェクトのさまざまな種類を処理する方法はありません。彼らは同じタイプである必要があります。 –

答えて

2

は、あなたはリフレクションを使用することができますが、これは安全なタイプではありません(AまたはBは、もはやgetName()をサポートする場合は、コンパイル・エラーを取得していないではないだろうと反射がかなりあります。直接メソッドを呼び出すよりも遅く

また、インターフェースを共有する2つのアダプタを実装して(ジェネリックで)それらを使用することができます。解決策以下

interface Wrapper { 
    String getName(); 
} 

class WrapperA implements Wrapper { 
    final private A a; 
    public WrapperA(A wrapped) { 
     this.a = wrapped; 
    } 
    @Override public String getName() { 
     return a.getName(); 
    } 
} 
+0

はい、これは道になります.. –

+2

このパターンの名前は "adapter pattern"です。 –

+0

@JBNizetがそれに応じて更新されました、ありがとうございます! –

1

をあなたに到達するために、一般的な方法でinstanceof operatorを使用しています出力。

public static void main(String[] args){ 
     new methods().getName(new B()); 
     new methods().getName(new A()); 
    } 

    private <T> void getName(T obj) { 
     if(obj instanceof B){ 
      ((B) obj).getName(); 
     } 
     else{ 
      ((A) obj).getName(); 
     } 
    } 
関連する問題