Я хочу создать отдельный класс, который ссылается на тип сервиса с использованием интерфейса. Сервис может иметь разные реализации. Разные реализации будут обрабатывать разные типы запросов. Раньше я определял интерфейс примерно так:
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
заключался в том, что я мог использовать разные реализации, но, похоже, мне нужно привязаться к определенному типу во время компиляции, чтобы избежать этого предупреждения!
Есть ли способ написать повторно используемый интерфейс, который использует дженерики без этого раздражающего предупреждения?