2017-02-10 12 views
2

Javaのジェネリックスに対する新しいishですが、実行時にどのように戻り型をコンパイルできますか?これは可能ですか? エンティティのデコレータとして動作するクラスがあります。エンティティプロパティがマップされている場合は別の値が返されますが、エンティティのプロパティの値は任意のタイプにできます。次のようにJava - ジェネリック型の戻り型

私のコードは次のとおりです。明らかにGENERIC_TYPEは、私が知りたいのか、ワイルドカード可能タイプ


package com.example; 

public final class ObjectPropertyGetter 
{ 
    private final Map mappings; 

    public ObjectPropertyGetter(Map<String, GENERIC_TYPE> mappings) 
    { 
     this.mappings = mappings; 
    } 

    public GENERIC_TYPE getValueFor(Object entity, String property) 
    { 
     GENERIC_TYPE valueOfProperty = getValueOfProperty(property); // left out for simplicity 

     if (mappings.containsKey(property)) { 
      return mappings.get(property); 
     } 

     return valueOfProperty; 
    } 

    public class MyEntity{ 
     public String foo; 
     public Integer bar; 
    } 

    public static void main(String[] args) 
    { 
     Map<String, GENERIC_TYPE> mappings = new HashMap(); 
     mappings.put("bar", 3); 

     MyEntity entity = new MyEntity(); 
     entity.foo = "a"; 
     entity.bar = 2; 

     ObjectPropertyGetter propGetter = new ObjectPropertyGetter(mappings); 

     String foo = propGetter.getValueFor(entity, "foo"); // equals "a" 
     Integer bar = propGetter.getValueFor(entity, "bar"); // equal 3 
    } 
} 

+3

戻り値の型(または任意のJava型)はコンパイル時のものです。私は 'GENERIC_TYPE'を持っているところで' Object'を使い、必要なものに戻り型をキャストします。あなたはジェネリックキャストでキャストを隠すことができますが、これはもっと安全ではなく、手動キャスティングでキャストが起こっていることが明示的に示されます。 –

+2

また、[未処理の種類、およびそれらを使用しない理由](http://stackoverflow.com/q/2770321/3788176)も参照する必要があります。 –

+0

はい、マッピングには何がありますか?クラスやPOJO? – efekctive

答えて

1

別の設計で、一般的なほか、MyEntityその時々の代表のラッパーも、時にはいます他の何か。

あなたはMyEntity実装していること、Entityインターフェースを宣言する必要があります:まず

Entity ent = new MyEntity(); 
ent = mapBar(ent, 3); 

String foo = ent.getFoo(); // "a" 
int bar = ent.getBar(); // 3 
:同じように使用後

public static Entity mapBar(Entity toWrap, int newBar) { 
    return new Entity() { 
     @Override 
     public String getFoo() { 
      return toWrap.getFoo(); // delegate 
     } 

     @Override 
     public int getBar() { 
      return newBar; // return another value 
     } 
    }; 
} 

interface Entity { 
    String getFoo(); 
    int getBar(); 
} 

class MyEntity implements Entity {...} 

は、その後、あなたが匿名クラスを使用してデコレータを作成することができます

+0

はい、これについて考えましたが、私はこの "コンポーネント"を使用します。他の場所では、私はかなり多くのエンティティを持っているので、これだけではなく、これをやりたいと思うでしょう。そうでなければ、それは解決策になります – Matt

+0

@Mattよく、あなたは元の 'Entity'を上書きする必要はありません。 –

+0

true、また私は約10フィールドを私は上書きする必要がありますが、彼らは簡単に構成する必要があります。私はそれがあまりにも早すぎるので、これを最初に言及しなかった:) – Matt

関連する問題