2014-03-05 5 views
-2

У меня есть этот вопрос относительно generics.Can кто-нибудь объяснить мне, почему варианты 4 и 6 [я знаю об этом варианте] верны?У вас есть осложнения с картой?

Рассмотрим следующий код:

import java.util.*; 
public class TestClass 
{ 
    public static void main(String[] args) 
    { 
    // put declaration here  
    m.put("1", new ArrayList()); //1 
    m.put(1, new Object()); //2 
    m.put(1.0, "Hello"); //3 
    System.out.println(m); 
    } 
} 

Как «м» быть объявлена ​​таким образом, что приведенный выше код будет компилироваться и работать без ошибок?

  1. Map m = new TreeMap();
  2. Map<Object, Object> m = new TreeMap<Object, Object>();
  3. Map<Object, ?> map = new LinkedHashMap<Object, Object>();
  4. Map<Object, ? super ArrayList> m = new LinkedHashMap<Object, ArrayList>(); будет работать если строки // 2 и 3 // закомментировано.
  5. Map<Object, ? super ArrayList> m = new LinkedHashMap<Object, ArrayList>(); будет работать, если строки // 1 и // 3 закомментированы.
  6. Map m = new HashMap();
+0

Варианты 1. и 2. идентичны. Можете ли вы их обновить? – vefthym

+2

Вы пытались скомпилировать и скомпилировать себя? И в чем разница между вариантами 1 и 2? – Boris

+0

Вариант 2 - 2.Map m = new TreeMap (); – Dahlia

ответ

2

Для понимания этой проблемы ознакомьтесь с общей подписью метода Map#put, который вы используете здесь. В нем говорится:

V put(K key, V value) 

, что означает, что вы можете поставить ключ, присваиваемые общий тип из Map «типа ключа s K и значения, которое отнесено к родовому типу из Map» типа значения s V. Это должно быть верно для всех ваших пар ключ-значение, которые вы положили на карту. От вашего кода, вы подвергаете следующие ключи в карту:

  1. String буквального "1"
  2. An Integer в штучной упаковке int буквального 1.
  3. A Double by the boxed double literal 1.0.

Единственный общий супер типа этих объектов является Object типа, который необходим для K для того, чтобы обеспечить все эти объекты будут использоваться в качестве ключа.

Для значений у вас есть:

  1. ArrayList экземпляр.
  2. Object экземпляр
  3. String буквальным "Hello"

Снова, единственный общий супер тип этих объектов является Object тип, который необходим для V для того, чтобы все эти объекты будут использоваться как значение карты.

В результате допускаются только Map экземпляров с общей подписью Map<Object, Object>. Какую реализацию используемого вами интерфейса Map зависит от вас, если он равен assignable для типа переменной карты, то есть вы можете использовать LinkedHashMap, TreeMap или HashMap, поскольку они отличаются только тем, как они хранят свои данные , Обратите внимание, что для общего типа переменных обратите внимание, что использование подстановочных знаков ? или ? extends ... для вашей переменной приведет к тому, что вы больше не сможете добавлять значения в карту. В этом уроке объясняется, почему.

Что касается типов с непиковой сигнатурой, которые вы используете, они ведут себя аналогично Map с общей подписью <Object, Object>. Однако такие типы сырья должны быть not longer be used after the introduction of Java 5.

Со всей этой информацией вы можете ответить на свой (экзамен) вопрос самостоятельно.

1

Номер 4 является правильным для линии 1, так как «1» является строка, которая имеет объект суперкласса и ? super ArrayList означает, что вы можете использовать ArrayList или любой суперкласс ArrayList.

номер 6 является правильным, потому что вы используете нетипизированную (необработанную) карту, так что это похоже на:

Map<Object, Object> m = new HashMap<Object, Object>(); 

Для хранения таких значений, которые можно использовать карту, но это не очень хороший выбор. Вы не должны использовать нетипизированные коллекции вообще. Подумайте, как вы можете изменить свой дизайн, чтобы не использовать такую ​​карту.

+0

Спасибо за ваш ответ. – Dahlia

+0

«... или любой суперкласс ArrayList». Я уверен, что вы имели в виду любой подкласс здесь. – Boris

+0

@ user3301492, пожалуйста, прочитайте о нижних ограниченных подстановочных знаках http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html –

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