2014-10-31 4 views
0

То, что я хочу сделать, это в конце концов, быть в состоянии выполнить это:Java расширения Map.Entry() без дженериков

HashMap<FooClass> foo; 

Однако мне не удалось реализовать FooClass здесь:

Я пробовал

public class FooClass<String, List<String>> extends Map.Entry<String, List<String>> 

, который вызывает проблемы с List<String>

Если я SIMPL римента и попробуйте

public class FooClass<String, Integer> extends Map.Entry<String, Integer> 

тогда я не получаю никакого интерфейса ожидается здесь ошибка в

Map.Entry<String, Integer> 

Итак, если я изменю его Map.Entry<> то он ожидает идентификатор. Каким будет правильный способ расширения Map.entry?

+0

Имена, объявленные между '<>' в 'class FooClass >' define ** new ** _type variables_. Они не относятся к существующим типам. –

+0

Почему вы пытаетесь расширить «Map.Entry»? Просто сделайте 'FooClass' и переопределите' hashCode() ', если вам нужно. –

+0

Класс не может «расширить» [интерфейс] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html). –

ответ

2

Не пробовал компилировать их, но, как правило, не используется параметр типа на классе, Вы заявляете в этих случаях:

public class FooClass implements Map.Entry<String, List<String>> 

или

public class FooMap extends HashMap<String, List<String>> 
0

Там нет никакого способа что вы можете написать HashMap<Foo> для любого одиночный аргумент Foo. HashMap ожидает два типа параметров; беспорядок с Map.Entry не изменит это.

+0

нет ли эквивалент 'typedef' в Java, который существует на C++? –

+0

Нет. Нет. –

1

Я делаю догадки о том, что вы пытаетесь сделать, потому что это не ясно мне из вашего вопроса. Но если вы пытаетесь реализовать реализацию HashMap для определенной цели, которая не раскрывает общие параметры, вы можете сделать это, расширив параметр HashMap.

Например, скажем, что вы хотите сделать, это сопоставить свойство name в своих экземплярах FooClass с самими экземплярами. Вы можете расширить HashMap, как это:

public class FooClassMap extends HashMap<String, FooClass> { } 

Тогда вы просто создать экземпляр новой реализации, без какого-либо синтаксиса дженериков, как это:

FooClassMap fooClassMap = new FooClassMap(); 

И использовать его как это (если он имеет имя свойство, которое инициализируется в конструкторе):

FooClass fooClass = new FooClass("fooClassName"); 
fooClassMap.add(fooClass.getName(), fooClass); 

Надеюсь, это то, что вы ищете, извините, если это не так.

+0

Это хороший момент, но у меня были проблемы с расширением Map.Entry вот так: 'public class FooClassMap extends HashMap {interface Entry extends Map.Entry {}}'. Есть ли у вас какие-либо предложения? – NickSoft

Смежные вопросы