2017-12-30 26 views
1

私は、Javaのジェネリックに新しいです。Javaの総称関数で、具体的な属性へのアクセス

public class C<T extends MyClass> implements MyInterface<T>{ 
     public void f(T obj){ 
     ... 
     obj.getName() 
     } 
    } 

機能f上記目的MySubClass1MySubClass2の二つのタイプのために呼び出されます。私は、次のように一つの機能を書かれています。 MySubClass1MySubClass2は抽象クラスMyClassから継承された2つのconcreterクラスであり、nameMySubClass2の属性です。

fは MySubClass2のオブジェクトと呼ばれ

、私は上記のような名前にアクセスしたいと思います。私はそれを行う方法を理解することはできません。

+2

あなたはあなたのコードの構文エラー(不足しているセミコロン)を持っています。 'obj'を' MySubClass2'にキャストできますが、これは悪いデザインです。 [責任の連鎖](https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern)が役に立ちます。これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように見えます。あなたが実際に達成しようとしていることを詳述するために気をつけますか? – Turing85

+0

[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve) –

+1

@AominèここにMCVEが必要なのはなぜですか? – lexicore

答えて

5

...と名前がobjMyClass由来ことができるので、その後、あなたの方法は、それがそこにいるに頼ることができないMySubClass2

の属性です。

これは、あなたのデザインはどちらかあなたが別の方法を持っているか、あなたはMyClassに名前を移動するよう変更する必要があります示唆しています。 instanceofは、あなたが一歩、あなたのデザインを再考するべき使用して、10人のうち

if (obj instanceof MySubClass2) { 
    String name = ((MySubClass2)obj).getName(); 
} 

...しかし9回:

あなたはinstanceofチェックとキャストでそれを行うことができます。

0

MyClassに制限されたTをとる一般的な方法では、MyClassの方法しか利用できません。 getNameMySubClass2にのみ実装されているため、MySubClass2へのキャストなしでgetNameにアクセスすることはできません。これは最初のf()メソッドを汎用的にする点に反します。

あなたはこのように、f()Tからnameを引っ張るFunctionオブジェクトを渡すことができます。

public void f(T obj, Function<T,String> getName){ 
    ... 
    String name = getName.apply(obj); 
} 

を呼び出し側がこのようf()を呼び出します。この技術は、あなたが呼び出すことができますことを

MySubClass2 s2 = new MySubClass2(); 
MyInterface<MySubClass2> c = new C<>(); 
c.f(s2, MySubClass2::getName); 

注意fMySubClass1上のオブジェクト、限り、あなたは名前を取得するいくつかの方法を提供として:

MySubClass1 s1 = new MySubClass1(); 
MyInterface<MySubClass1> c = new C<>(); 
c.f(s1, x -> "<no-name>"); 
+2

この解決策では、問題が1つ上に移動するだけです。呼び出し側が、 'MySubClass2'を含むかもしれませんが、' MyClass'参照のみで始まる場合はどうなりますか? – Turing85

+0

@ Turing85この問題は、汎用呼び出しの中で 'MyClass'のサブクラスを区別するタスクに「焼き付けられる」。この醜さはいくつかの場所に現れなければならない。私は方法自体に呼び出しサイトを好む。 T.J.他の選択肢を示した。 – dasblinkenlight

関連する問題