Я хочу создать один класс, который относится к типу службы с использованием интерфейса. Служба может иметь разные реализации. Различные реализации будут обрабатывать различные типы запросов. В прошлом я бы определить интерфейс что-то вроде этого:Многоразовый интерфейс, который использует генераторы
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
заключалась в том, что я мог использовать разные реализации, но мне кажется, что во время компиляции мне нужно заблокировать определенный тип, чтобы избежать этого предупреждения!
Есть ли способ написать многоразовый интерфейс, который использует дженерики без этого раздражающего предупреждения?
Я не совсем понимаю, что делает ваш интерфейс (что означает «обрабатывать различные типы запросов», в каком контексте?), Но это похоже на неправильное использование интерфейса - в основном из-за вашей реализации использует «переключатель» вместо полиморфизма. Похож на то, что ваша логика выше могла быть сделана гораздо проще с помощью «Карта» –
davin
Мне пришлось удалить конфиденциальные данные, должно было сделать лучше, - извините за путаницу. Я могу сказать, что get принимает данные и тип запроса. Тип запросов зависит от реализации: в настоящее время существует 4 поддерживаемых реализации и более 30 различных типов запросов, разбросанных по ним, где я работаю. – BigMac66