2015-03-24 5 views
0

У меня есть ниже программы:Java Generic супер ключевое слово

public void performGenerics() { 
     List<? super Animal> testAnimal = new ArrayList<Animal>(); 
     testAnimal.add(new Dog()); 
    } 

В приведенном выше коде, Animal является супер класс собаки. Мой вопрос - это смысл суперсредства, он должен принимать только класс Animal или Object. Хотя Собака является подклассом Animal, почему она позволяет добавлять собаку в коллекцию testAnimal? Я совершенно смущен этим. Может ли кто-нибудь сообщить мне об этом?

ответ

0

Точный смысл этого заключается в следующем:

// This is a list of "something" whose superclass is definitely an animal 
List<? super Animal> testAnimal = new ArrayList<Animal>(); 

Это своего рода бессмысленно. Лучше написать

// My list contains animals and any subclasses of them 
// the new object gets its specialisation from the declaration of the 
// type on the left (Java 7 onwards) 
List<Animal> listOfAnimals = new ArrayList<>(); 

Если вы хотите, чтобы ваш список принимать объекты, а также животных, то, возможно, вы не должны использовать дженерики ... или, возможно, вы не должны хотеть, чтобы смешать оба объекта и животных один список.

+0

Спасибо, но я не хорошо разбираюсь в java 7. Я просто хочу посмотреть, как ключевое слово super в основной родовой работе. то есть, согласно спецификации java, в нем говорится, что при использовании ключевого слова super оно должно принимать все, что супер или равно классу. Например, если скажем '? extends Animal ', тогда он должен принять класс Animal или object. Но я вижу, что он также принимает класс «Собака», который является подклассом Animal. Который не должен быть принят. Невозможно получить четкое представление об этом. Было бы здорово, если бы вы могли пролить свет на это. – user2082928

+0

Вы правы. Я думал о расширении ... почему вы пытаетесь это сделать? –

0

На самом деле, переменная List< ? super Animal > список неизвестного типа A элемента, который является суперкласс Animal. Поэтому вы можете сделать с ним все, что только нужно сделать для этого предположения.

Методы этого класса, которые принимают параметры типа A, такие как add(), может принять любой аргумент, который имеет тип A или любого подкласса этого. Dog, являющийся подклассом Animal, поэтому должен быть подклассом A.

Методы, которые возвращают типа A, такие как get(), совершенно бесполезны, так как единственное, что мы знаем о том, что A это суперкласс Animal.

Так почему бы вам использовать эту конструкцию?

Ну, вы не использовали бы его как представлено. Вместо этого рассмотрим пример SortedSet<T>. Вы можете предоставить Comparator< ? super T > одному из своих конструкторов, поскольку единственным методом компаратора, который когда-либо используется, является акцепторный метод (compare()).

Это означает, что вы можете создать отсортированный набор животных, отсортированный набор клыков или отсортированный набор собак с использованием того же компаратора животных.

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