Мой работодатель хочет, чтобы я использовал IntelliJ для разработки Java. Раньше я всегда использовал eclipse.
Одной из моих любимых функций в eclipse была возможность щелкнуть по переменной, параметру метода, полю класса и т. Д. И увидеть использование этих переменных, выделенных по всему классу.
Есть ли способ включить эту функцию в IntelliJ IDEA? Я использую Ultimate версии 9.0.3. } public SharpItem реализует AbstractItem { } public BluntItem реализует AbstractItem { } открытый интерфейс ...
Допустим, у нас есть программа, которая содержит такие классы:
public interface AbstractItem {
}
public SharpItem implements AbstractItem {
}
public BluntItem implements AbstractItem {
}
public interface AbstractToolbox {
//well the problem starts here...
public List<AbstractItem> getItems();
}
public ExpensiveToolbox implements AbstractToolbox {
private List<SharpItem> items = new ArrayList()<SharpItems>;
public List<SharpItem> getItems() { return this.items; }
}
public CheapTooblox implements AbstractToolbox {
private List<BluntItem> items = new ArrayList()<BluntItem>;
public List<BluntItem> getItems() { return this.items; }
}
Легко, верно? Что ж, допустим, теперь мы хотим создать такой метод (в каком-то случайном классе):
public void doImportantStuff(AbstractToolbox toolbox) {
//important stuff!
//this obviously won't work
List<AbstractToolbox> items = toolbox.getItems();
//do some stuffwith all items
}
Теперь проблема в том, что в Java коллекции с обобщениями не являются ковариантными (надеюсь, это термин, который я ищу), и я могу Не назначайте ArrayList
списку List
. Единственное решение, которое я вижу здесь, - это продублировать код и создать версию для каждого типа, но это явно отстой (что, если бы у нас было больше классов, реализующих AbstractToolbox с разными списками?). О, очевидно, что вторым решением было бы отказаться от дженериков и создать обычный список, но насколько это хорошая практика?
Есть ли какие-либо шаблоны / методы проектирования для решения таких проблем?
@Edit: хорошо, так что я могу быть недостаточно точным. Я хочу, чтобы все классы, которые расширяют AbstractToolbox, имели список определенных классов, которые расширяют AbstractItem, а затем мне нужен метод, который будет принимать AbstractToolbox в качестве параметра и что-то делать с элементами в своем списке (используя классы, которые будут определены в AbstractItem, чтобы все элементы каждого возможного списка действительно имели их).