Короче говоря, я пытаюсь написать реализацию AbstractMap
, и я столкнулся с проблемой синтаксиса, которую я не понимаю.
Рассмотрим следующие два эскиза (идентификаторы с My
перед ними являются пользовательскими типами).
(1) Не работает:
public class CustomMap extends AbstractMap<MyKey,MyValue> {
private Set<Map.Entry<MyKey,MyValue>> data = null ;
public static class MyMapEntry<K,V> implements Map.Entry<K,V> {
//...
}
public static class MyEntrySet<E> extends AbstractSet<E> {
//...
}
public static class MyEntrySetIterator<E> implements Iterator<E> {
//...
}
{ // initializer block
this.data = new MyEntrySet<MyMapEntry<MyKey,MyValue>>() ;
}
// (constructors and methods of the Map interface)
}
(2) Рабочая:
public class CustomMap extends AbstractMap<MyKey,MyValue> {
private Set<Map.Entry<MyKey,MyValue>> data = null ;
public static class MyMapEntry<K,V> implements Map.Entry<K,V> {
//...
}
public static class MyEntrySet<E> extends AbstractSet<E> {
//...
}
public static class MyEntrySetIterator<E> implements Iterator<E> {
//...
}
{ // initializer block
this.data = new MyEntrySet<Map.Entry<MyKey,MyValue>>() ;
}
// (constructors and methods of the Map interface)
}
Единственное отличие состоит в том, как я инстанцировал this.data
(Set
, поддерживающий Map
): очевидно, компилятор не принимает экземпляр Map.Entry
(например, MyMapEntry
) в качестве параметризованного типа MyEntrySet
.
Компилятор жалуется на "несовместимые типы".
Интересно, почему.
Пожалуйста, оставляйте комментарии, если мне нужно уточнить,
ТИА,
FK82