2014-11-14 2 views
0

Мне интересно, являются ли эти два метода по существу одинаковыми?Общий метод против абстрактного типа методу

public static Parent withParent(Parent p) { 
    p.doSomething(); 
    return p; 
} 

public static <E entends Parent> E withGenericType(E e) { 
    e.doSomething(); 
    return E; 
} 

public class Child extends Parent { 
    @Override 
    public void doSomething() { 
     System.out.println("override"); 
    } 
} 

public static void main(String [] args) { 
    // are they the same ? 
    withParent(new Child()); 
    withGenericType(new Child()); 
} 

а также в каком случае вы бы использовали одно и другое?

+1

Пока йоЗотеЬЫпд() не переопределен в классе к югу, то они должны делать то же самое ... – brso05

+0

Что возвращаемый тип родового 'with', если вы предоставляете аргумент типа «Ребенок»? –

ответ

0

Это не одно и то же.

Представьте, что вы есть класс Child extends Parent:

Child c = new Child(); 
c = with(c); 

Это скомпилировать с помощью универсальной версии, но не с необщего версии (так как это было бы вернуть Parent, а не Child).

С необщего версии, вы должны были бы бросить ссылку обратно на Child, опираясь на поведение метода, чтобы быть уверенным, что это будет работать:

Child c = new Child(); 
c = (Child) with(c); 

дженериков по существу добавить, что бросание для тебя.

Зачем вам это нужно? Рассмотрим встраивание выше немного:

Child c = with(new Child()); 
+0

, но как насчет родителя p = с (new Child()); если мне действительно не нужен фактический тип, который он возвращает? – peter

+0

@Nizil Ребенок - родитель, но это не значит, что «Parent p = new Child(); Ребенок c = p; 'будет компилироваться. – yshavit

+0

@ user1389813 Если вы не заботитесь о типе, то да, вам не нужны дженерики. – yshavit

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