2012-03-25 7 views

答えて

2

このお試しください:

public interface Nameable { 
    String getName(); 
} 

:だから今、あなたがこのような何かをする必要があります

public interface LocationDao<T extends Nameable> { 
    ObjectId findByName(T location); 
} 

public <T> ObjectId getObjectByName(T name) 

またはジェネリックを使用するインターフェイスまたはクラスに追加しますコメントに記載されているように、getName()メソッドを持つパラメータが必要です。あなたはそれを真実にするための制限が必要です。 duffymoのアプローチは、(などクリーナー)が好ましいが、あなたのパラメータクラスのソースを制御していない(または、などのインターフェイスを課すことができない)場合

+1

彼は 'getName()'メソッドを持つTが必要です... – assylias

+0

合意 - それは次のステップです。 – duffymo

+0

そして、クエリのフィールド名も引数の型に依存します... –

2

、あなただけのこの操作を行うことができます:

public <T> ObjectId getObjectIdByNationName(T param, String name, String fieldName) { 
    Query<T> query = datastore.createQuery((Class<T>)param.getClass()); 
    query.field(fieldName).equal(name); 
    return query.get().getId(); 
} 

あるいは、この非ジェネリック版(あなたがタイプのスコープなしで行うことができるので):

public ObjectId getObjectIdByNationName(Object param, String name, String fieldName) { 
    Query<?> query = datastore.createQuery(param.getClass()); 
    query.field(fieldName).equal(name); 
    return query.get().getId(); 
} 

ただし、フィールド名と名前ですべての時間を呼び出すために、呼び出し側によっていくつかの重複を意味します。各パラメータタイプが1つの場所からのみ呼び出される場合は、重複はありません。

+0

+1 - これは良い解決策のようにも見えますが、別のインターフェイスを作成したくない場合はそうです。 – duffymo