У меня есть этот интерфейс (упрощенный) JavaВыполнить конкретный метод параметризованную класса
public interface MyInterface<T> {
public String run(T arg);
}
и некоторые классы, которые реализуют этот интерфейс, т.е.
public final class SomeImplementation1 implements MyInterface<String> {
@Override
public String run(String arg) {
// do something with arg and return a string
}
}
и
public final class SomeImplementation2 implements MyInterface<CustomClass> {
@Override
public String run(CustomClass arg) {
// do something with arg and return a string
}
}
Теперь, У меня есть глобальный менеджер ресурсов для всех этих реализаций, который запускает все из них в списке для последнего Применение. То, что я хотел бы достичь, это что-то вроде этого, что, очевидно, дает мне ошибку
public final class MyInterfaceManager {
private List<MyInterface<?>> elements = new List<MyInterface<?>>();
public MyInterfaceManager() {
elements.put(new SomeImplementation1());
elements.put(new SomeImplementation2());
// more implementations added
}
// this is what I would like to achieve
public <T> void run(T arg) {
for(MyInterface<?> element: elements) {
String res = element.run(arg); // ERROR
}
}
}
потому, что «аргумент не может быть преобразован, чтобы захватить № 1? С помощью вызова метода преобразования». Возможное решение может быть выполнить тест instanceof
внутри цикла, и отбрасывать элемент его вещественного типа, наряду с аргументом, а также, как тот
public <T> void run(T arg) {
for(MyInterface<T> element: elements) {
if (element instanceof SomeImplementation2) {
String res = ((SomeImplementation2)element).run((CustomClass)arg );
} else if // other tests here ...
}
}
Но я не люблю его, это не элегантно, и это заставляет меня делать много instanceof
и бросает. Итак, мне интересно, есть ли лучший способ достичь этого. Спасибо за вашу помощь :)
Вы добавляете метод 'getClass' в' interface', а затем просто проверяете 'assignableFrom' для каждого экземпляра в' List', чтобы увидеть, можно ли безопасно передать переданный параметр в требуемый параметр, а затем вы ' Class.cast'. –
@BoristheSpider спасибо за предложение, я попробую это завтра, потому что здесь немного поздно :) – Polentino
@BoristheSpider Вы должны сделать ответ. –