2012-09-29 3 views

ответ

20

Без доказательств, я полагаю, вы говорите о Java's Generics поддержку ...

Дженерики позволяют абстрагироваться над типами

До Java 5 было трудно обеспечить классы, которые были способны поддержки нескольких различных типов объектов без необходимости кодирования для каждой конкретной ситуации, поэтому для людей было распространено вместо этого Object.

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

List myIntList = new LinkedList(); // 1 
myIntList.add(new Integer(0)); // 2 
Integer x = (Integer) myIntList.iterator().next(); // 3  

Теперь, это достаточно очевидно, но если вы прошли только List, вы должны проверить каждый и каждый элемент в списке для корректности ...

но теперь, мы можем сделать это ...

List<Integer> myIntList = new LinkedList<Integer>(); // 1' 
myIntList.add(new Integer(0)); // 2' 
Integer x = myIntList.iterator().next(); // 3' 

Это контракт, который в основном говорит: «Этот список содержит только объекты типа Integer».

С помощью дженериков вы можете создать один класс, способный обрабатывать несколько разных типов данных или семейство типов данных (т. Е. Ограничить параметр так, чтобы он был расширен из определенного родительского типа).

Iterator<? extends Number> itNum; 

В основном говорит, это будет содержать объекты, которые наследуют от Number, включают Integer, Long, Double, Float ...

Часто в методе и класса замедлений вы увидите что-то подобное ...

public class MyGenericClass<T> {...} 

или

public class MyGenericClass<T extends MyBaseObject> {...} 

Это позволяет обращаться к T, как если бы это был конкретный тип объекта, например ...

public class MyGenericClass<T extends MyBaseObject> { 
    private T value; 
    public MyGenericClass(T value) { 
     this.value = value; 
    } 
} 

Это позволяет компилятору (и JVM), чтобы существенно «заменить» маркер T с типом концерта (ладно, это немного сложнее, чем это, но это волшебство) ...

Это позволяет делать такие вещи, как ...

... new MyGenericClass<MySuperObject>(new MySuperObject()); 
... new MyGenericClass<MySuperSuperObject>(new MySuperSuperObject()); 

И знайте, что это будет только когда-либо принимать тип объекта указываю ...

ли прочитанный по ссылке в первом абзаце , Я уверен, что он может сделать больше справедливости, чем я могу;)

+3

(Возможно, ваша формулировка просто отличается от того, что у меня было бы) Список означает, что вы не знаете точный тип параметра, только чтобы он расширил Number. Это может означать список , список и т. Д.. Объявив такую ​​переменную, компилятор не сможет сказать, каков будет настоящий тип. В результате вызывающие методы, такие как «добавить», вызовут ошибки компиляции (идите и попробуйте). Коллекции, объявленные таким образом, используются в основном для итерации. Однако список может содержать любой объект, который является подклассом Number. – Matt

+0

+1 хорошая точка. благодаря – MadProgrammer

9
public class Grid<E> { 

Вот как определить общий класс в Java. Grid - класс, а E - формальный параметр типа.

Если вы действительно заинтересованы в получении информации о нем, вы найдете очень хорошую ссылку здесь - Java Generics FAQs - Frequently Asked Questions

1

Неясно, что вы спрашиваете, не смотря на то, что именно вы видите. Но, скорее всего, вы видите Generics на Java. Learn more about it here

Идея в основном заключается в том, чтобы повысить безопасность типов на Java. Итак, декларация вроде List<Integer> intList означает intList имеет целые числа в ней. И если вы попытаетесь поместить, скажем, String, это вызовет ошибку компиляции.

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