2015-08-14 4 views
2

В настоящее время я изучаю Общее программирование. Я не понимал, почему Generic Born. если есть Object Class(data Type). Ниже приведен код functioF1 и function21 в обоих переданных в качестве параметра HashCodeclass1. Оба должны передать переданный параметр конкретному классу, и вывод операции будет таким же. Тогда почему Generic приходит в картину?Разница между общим типом и объектом и дикой картой

package know.generic; 

import knowl.collection.hashcodeInternal.HashCodeclass1; 

public class ClassGeneric { 
    public <T> void functioF1(T arg) { 
     System.out.println(arg.getClass().getName()); 
     System.out.println("val1 " + arg); 
     HashCodeclass1 hCC = (HashCodeclass1) arg; 
    } 

    public void functioF21(Object arg) { 
     System.out.println(arg.getClass().getName()); 
     System.out.println("val2 " + arg); 
     HashCodeclass1 hCC = (HashCodeclass1) arg; 
    } 
} 

public class TestGeneric { 
    public static void main(String arg[]) { 
     ClassGeneric cg = new ClassGeneric(); 
     cg.functioF1(new HashCodeclass1()); 
     cg.functioF21(new HashCodeclass1()); 
    } 
} 
+0

Вы будете что-то здесь [использование дженериков] (https://www.google.co.in/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=generics%20usage%20in % 20java) – Panther

+0

Прежде всего, его устранение отливок – Panther

+1

Вам удалось создать разбитый пример с плохим неродственным ** и ** плохим (едва ли) общим кодом. Я бы начал с удаления кода, который вы показываете, он может только дать вам неправильные идеи. – Kayaman

ответ

1

См. javadocs для этого. Некоторые из соответствующего текста с сайта: -

Код, который использует дженерики имеет много преимуществ по сравнению с необщего код:

проверки типа 1.Stronger во время компиляции. Компилятор Java применяет сильную проверку типа к универсальному коду и выдает ошибки, если код нарушает безопасность типа. Исправить ошибки времени компиляции проще, чем исправлять ошибки времени выполнения, которые могут быть трудно найти.

2.Elimination of casts. Следующий фрагмент кода без дженериков требует отливки: Список list = new ArrayList(); list.add ("hello"); Строка s = (String) list.get (0); При повторной записи для использования дженериков код не требует литья: Список list = new ArrayList(); list.add ("hello"); Строка s = list.get (0); // no cast

3. Программирование программистов для реализации общих алгоритмов. Используя генераторы, программисты могут реализовывать общие алгоритмы, которые работают с коллекциями разных типов, могут быть настроены и безопасны по типу и легче читать.

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

0

Вы можете обратиться к javadocs и @Panther также указал то же самое.

Вы также можете обратиться к исходному коду HashMap. А также подумайте, нужно ли переписать этот код без использования дженериков, с какими проблемами вы столкнетесь, с которыми вы справились, используя дженерики?

Я просто переписываю ваш код. Вы можете проверить преимущество.

public class ClassGeneric { 
    public <T> T functioF1(T arg) { // changed return type from void 
     System.out.println(arg.getClass().getName()); 
     System.out.println("val1 " + arg); 
     // HashCodeclass1 hCC = (HashCodeclass1) arg; 
     return arg; 
    } 

    public Object functioF21(Object arg) { // changed return type from void 
     System.out.println(arg.getClass().getName()); 
     System.out.println("val2 " + arg); 
     // HashCodeclass1 hCC = (HashCodeclass1) arg; 
     return arg; 
    } 
} 

public class TestGeneric { 
    public static void main(String arg[]) { 
     ClassGeneric cg = new ClassGeneric(); 

     //no casting required and compile time check of type 
     HashCodeclass1 f1OutputObj = cg.functioF1(new HashCodeclass1()); 

     // you need to use casting 
     HashCodeclass1 f2OutputObj = (HashCodeclass1) cg.functioF21(new HashCodeclass1()); 
    } 
} 
Смежные вопросы