Избавление от дженериков на карте

Я использую класс 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()) { 
}
Другие вопросы по тегам