Избавление от дженериков на карте
Я использую класс StringMap, как показано ниже, чтобы упростить объявление Map:
public interface StringMap extends Map<String, String> {
interface Entry extends java.util.Map.Entry<String, String>{
}
}
public class StringHashMap extends HashMap<String, String> implements StringMap{
}
Проблема в том, что я не могу заставить StringMap.Entry работать так же, как StringMap. Если я сделаю это:
StringMap strings = new StringHashMap(); // this works perfectly fine
for (StringMap.Entry entry : strings.entrySet()) { // this doesn't work
}
Я получаю эту ошибку:
Error:(402, 49) java: incompatible types: java.util.Map.Entry<java.lang.String,java.lang.String> cannot be converted to com.nicksoft.nslib.StringMap.Entry
Есть ли способ обойти это?
Редактировать:
Я начинаю понимать, что это невозможно. По крайней мере, это невозможно при разумных усилиях. Я думаю, если бы это было так, я бы нашел кого-то еще, кто бы это делал Но если у кого-то есть хитрости, которые могут сделать код более читабельным - дайте мне знать.
1 ответ
Это связано с тем, что метод entrySet() не перегружен для возврата типа com.nicksoft.nslib.StringMap.Entry.
Поскольку вы не можете переопределить метод entrySet(), чтобы он возвращал ваш собственный тип, единственная опция, которую вы имеете, это переименовать его:
public interface StringMap extends Map<String, String> {
interface Entry extends java.util.Map.Entry<String, String>{
}
Set<Entry> myEntrySet();
}
public class StringHashMap extends HashMap<String, String> implements StringMap{
public Set<Entry> myEntrySet() {
//The implementation to return the set of your own entry type.
}
}
Тогда ваш цикл будет выглядеть так:
for (StringMap.Entry entry : strings.myEntrySet()) {
}