2011-01-18 2 views
2

java api определяет несколько дженериков и не-генериков с тем же именем - например, LinkedList и т. Д. Они оба разрешены с использованием того же оператора import java.util.LinkedList;. Но в одном пакете может быть только один открытый класс в .java-файле (с тем же именем).общий и не общий одноименный номер

Так мы можем получить тот же эффект? Я попытался следующий код:

package org.****.ai.ass1.part1; 
import java.util.LinkedList; 

public abstract class Test extends LinkedList { } 
//public abstract class Test<E> extends LinkedList<E> { } 

Без комментария, я получаю следующее сообщение об ошибке: The type Test is already defined. Однако обе строки компилируются, если я комментирую другую. Итак, как это делает java api?

ответ

4

Из-за способа Java реализует дженерики (Google для типа стирания), LinkedList<T> и LinkedList представляют собой точно такой же тип. Невозможно объявить два разных типа: один общий и один, с тем же полным именем.

+0

, чтобы сделать его более понятным: вы можете использовать экземпляр универсального класса, такого как не-общий класс (когда вы не обращаете внимание на предупреждения компилятора) – Ralph

+0

@Ralph: Это менее понятно для меня. Это тот же класс, с той же реализацией. С некоторыми ограничениями вы даже можете привести экземпляр из не общего типа в общий тип (возможно, наоборот, я не уверен). –

+0

вот что я имею в виду: общий класс тот же. Информация о конкретном родовом типе «вставлена», когда вы используете его (его экземпляр). Если вы не «ввели» эту общую информацию, вы используете общий класс, например, если у него нет дженериков. - Во всяком случае: это не была какая-то критика в вашем ответе (потому что это правильно). Я только хочу объяснить это немного больше, как дженерики работают по этому вопросу. – Ralph

0

Если вы определяете класс, как это:

package x; 

public class Clazz<T> { 

} 

вы можете использовать его в качестве общего и не-родового класса, а также:

public class X extends x.Clazz { 
} 

public class Y extends x.Clazz<String> { 
} 
0

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

Нравится java.util.List с Java 1.4 и List 1.5.

Как вы сказали, они имеют одно и то же имя, за исключением второго параметра родового типа.

В Java 1.5 или Java 5 они переписали многие классы коллекции, такие как List, Iterator, HashMap и т. Д., Чтобы включить параметры типового типа. Таким образом, у них нет двух версий одного класса в основных библиотеках Java, они просто переписали их, чтобы воспользоваться безопасностью типа, предоставляемой generics во время компиляции.

Однако, благодаря стиранию типа, общая версия списка точно так же, как обычная версия списка, для обратной совместимости. A List<String> заканчивается точно так же, как List.

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