インタフェースを使用してサービスのタイプを参照する単一のクラスを作成したいとします。サービスは異なる実装を持つことができます。異なる実装は、異なるタイプの要求を処理します。過去には私はこのようなインタフェース何かを定義します:ジェネリックを使用する再利用可能なインタフェース
public interface I_Test
{
public String get(String key, Enum type);
}
をし、このようにそれを実装:
public class Test_1 implements I_Test
{
public String get(String key, Enum type)
{
Enum_1 t1 = (Enum_1)type;
switch(t1)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}
良い、私はさまざまなニーズを満たすために私のインタフェースの異なる実装を使用することができます。 悪いですが、キャストを打つ必要があり、実行時にリスクがあります。
私はジェネリックがこれを解決することができることを期待していたので、私はこれでした:
public interface I_Test<T extends Enum>
{
public String get(String key, T type);
}
と、この:
public class Test_1 implements I_Test<Enum_1>
{
public String get(String key, Enum_1 type)
{
switch(type)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}
が、私はものを使用することを行くとき、私は私ない限り、型の安全性の警告を取得します私が使用しようとしているタイプの変数を宣言してください:
I_Test<Enum_1> t1 = new Test_1();
これは本当に私にはバグですI_Test
インターフェイスを作成するためのポイントは、さまざまな実装を使用できるようになっていましたが、この警告を避けるためにコンパイル時に特定のタイプにロックする必要があるようです。
この迷惑な警告なしにジェネリックを使用する再利用可能なインターフェイスを作成する方法はありますか?
私は本当にあなたのインターフェースが何をするのか理解していないが、それはインターフェースの誤用のように見えます(それがどのような文脈では、「要求の種類を処理するために、」何を意味するのでしょうか) - 主に実装理由多型の代わりに 'switch'を使います。 'Map' –
davin
で上記のロジックがはるかに簡単にできるように見えます。私は機密データを削除しなければなりませんでした。私が言うことは、getはデータと要求のタイプを取ることです。リクエストのタイプは実装依存です。現在、サポートされている実装は4つあります。また、私が働いている場所には30種類以上のリクエストがあります。 – BigMac66