2016-06-30 2 views
2

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

public void sumOfNumbers(List<? extends Number>numbers){ 
    int sum=0; 
    for(Number n:numbers){ 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

В этом методе без подстановочных знаков, показанных ниже, почему он может быть введен в параметр?

public<T extends Number> void sumOfNumbers(List<T>numbers){ 
    int sum=0; 
    for(Number n:numbers){ 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

И наконец, если? extends Number, то почему can not у меня есть Integer в каждом цикле, как показано ниже?

public void sumOfNumbers(List<? extends Number>numbers){ 
    int sum=0; 
    for(Integer n:numbers){//Why cant I do this?? 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 

Кроме того, почему вы можете поставить номер в течение каждого цикла, в этом случае разве Integer верхних границ? Разве это не ниже?

public void sumOfNumbers(List<? extends Integer>numbers){ 
    int sum=0; 
    for(Integer n:numbers){//Why cant I do this?? 
     sum+=n.intValue(); 
    } 
    System.out.println(sum); 
} 
+0

Я не понимаю, что вы спрашиваете в первом случае - вы спрашиваете, почему вы не можете написать «Список <Объект extends Number>' или «List » или ... что? –

+1

«Почему у меня нет целых чисел в каждом цикле», потому что ваш список необязательно состоит из 'Integer' - что, если это «Список »? –

+0

Да, это правда, но на основе правила верхней границы расширения не должно работать? – Eli

ответ

1

я написал ниже метод с и без шаблона. В первом случае, как отличается, а затем отбрасывается в объект для шаблона?

Метод будет более сложным, если вы замените Object на вопросительный знак.

class Foo<T>{} 

class Bar{ 
    static void barfoo(Foo<Object> foo){} 
    public static void main(String[] args){ 
     barfoo(new Foo<Bar>()); // Doesn't compile 
    } 
} 

В этом методе без шаблона показано ниже, почему это может поставить в параметре?

Метод имеет параметр типа T который extends Number. Благодаря этому параметру типа, компилятор знает, что любой List<T>, переданный этому методу, будет содержать числа.

если? extends Number, то почему can not у меня есть Integer в каждом цикле, как показано ниже?

Что делать, если numbers не List из Integer с? Поскольку его параметр типа должен только расширяться Number, он может также быть Double s. Или Long s. Или даже BigDecimal s.

2

Прежде всего, давайте опишем, что вы делаете, когда говорите <T extends Number>. Что это говорит в уме компилятора: «Используйте T как ссылку на общий, который должен расширять класс Number». Итак, чтобы ответить на ваш первый вопрос,

В первом случае, как отличается, то отключение в объекте для шаблона?
Вы действительно ничего не делаете, «разные». Все, что вы делаете, говоря «Использовать слова объекта в качестве ссылки на родовой, что ...» На самом деле, если вы попытаетесь это сделать:

public class Subclass<java.lang.Object extends Number> 

компилятор будет жаловаться: Check class headers... parsing individual files failed! Это потому что вы на самом деле не используете Object, но слово Объект. См. Type Parameter Naming Conventions в учебнике об общих принципах.

См. Ответ dorukayhan на ответ на два других вопроса.