2016-04-19 2 views
0

注:この質問は主に理論的なものです。私はこれ以来、を使ってあきらめました。は、自分のコードを過度に複雑にしてしまい、反パターンのような臭いを感じました。しかし、私はそれが理論的には面白いと思っており、そのコミュニティの助けが大好きです。Javaの引数は、別のオブジェクトに含まれるクラスによって型にバインドできますか?

私は画像操作のために世紀の回りに書かれたコードを改造しています。多数の冗長性を持つ単一のクラスをいくつかのBiFunctionフィルタに分割することから始めます。それらはそれぞれBufferedImageとIntensity(Double)を受け取り、新しいBufferedImageを返します。もちろん、これらの画像フィルタの多くは、効果半径や強度などの追加の懸念があります。効率的に連鎖させる場合は、これらを「制服」(または準-constants)を使用します。

私の現在の方法は、ImageFilterクラスをさらに拡張し、ユニフォームをBeanスタイルのプロパティとして設定するだけです。私が最初にやって考えると、インタフェースで開催されたジェネリッククラスにそれらを制約し、の線に沿って何か持っていた。そこに

public void addProperty(Uniform<T> property, T type) 

、Tは制服によって完全に指定されています。

元のクラスは、これらの制服をすべてHashMapのString名で保持していましたが、それは多くの悪い習慣の始まりです。スペルミスによりコードが失火すると、無責任なコードになります。私は成長したように、ただそこにシングルトンを使用することを好むだろう。

したがって、要約すると、Javaでは、パラメータ型を別のパラメータのジェネリックにバインドできますか?もしそうなら、どうですか?もしそうでなければ、将来誰かがJava Genericsを拡張する計画を知っていますか?

ありがとうございました!

+0

がどのようにハードあなたはそれを試してみると、私たちにコンパイラに何を伝えるためにあるかもしれないと思います参照してください

new ImageFilter().addProperty(new Uniform<>(), "test"); //or new ImageFilter().addProperty(new Uniform<String>(), "test"); //if for some reason JVM can't infer the type itself, it can be set manually new ImageFilter().<String>addProperty(new Uniform<String>(), "test"); 

サンプルの使用であります言った? –

+0

@ HankD有効なコードではないことがすでに分かっていると思います。コンパイルされません。文字通りそのコードを入力する場合、コンパイラはTを型に解決できないことを拒否します。問題は、これが一般的な真実か、問題を解決する構文またはパターンがあるかどうかです。 –

+0

まだ何を意味するのかわからない、なぜ 'public void addProperty(Uniform プロパティ、Tタイプ)'はあなたが望むものではありませんか? – HuStmpHrrr

答えて

1

はい、メソッド自体に型パラメータを定義するだけで済みます。以下の例を確認してください。

パブリッククラス制服{

} 
public class ImageFilter { 
    //store in a list which can store any type of Uniform 
    List<Uniform<?>> uniformList = new ArrayList<Uniform<?>>(); 

    //store in a map which can store any type of uniform and uses type as key 
    Map<Class<?>, Uniform<?>> uniformMap = new HashMap<>(); 

    //Type parameter 'T' on the method itself 
    public <T> void addProperty(Uniform<T> property, T type) { 
     uniformList.add(property); 
     uniformMap.put(type.getClass(), property); 
    } 
} 
{ 
    //sample usage 
    new ImageFilter().addProperty(new Uniform<>(), "test"); 
    new ImageFilter().addProperty(new Uniform<>(), new Double(2.0)); 
} 

このlink for more information.

+0

うまく動作します。私はユニフォーム(Shader-speak、btw)をリストではなくマップに保存したいと考えていますが、正式に回答を選ぶ前に、どうやってそれを行うことができるかについて少し研究します。一般的に私は時間のおかげで出てくる。 (引用:「TypeInferment.Uniform 、キャプチャ#1?)は、型マップ、キャプチャ#1?>の引数には適用されません(TypeInferment.Uniform 、T ) ") –

+0

@MichaelEricOberlinマップをサポートするコードを変更しました。それが動作しない場合は教えてください。 – 11thdimension

+0

マップのバージョンがうまく動作します。私はまだ私がやろうとしていることをするためのよりよい方法を見ています。私はJavaのジェネリックスがはるかに優れていることを理解していますありがとう。 –

関連する問題