Почему Wild Cards нельзя использовать в объявлении общего класса и метода? - PullRequest
0 голосов
/ 28 марта 2012

Декларация, как это:

  class A<X extends Number & List> {  } 

разрешено. Где-то такое объявление не разрешено.

  class A<? extends Number & List> {  }

Есть ли логическое объяснение того, почему Java ограничивает нас в этом?

и какая разница между

      <T extends Number>  
     & <? extends Number>?

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Если вы используете <? extends Number & List>, то вы не сможете делать что-либо с параметром типа.Это было бы совершенно бесполезно.

Аналогично, ? extends Number позволяет вам иметь дело с особым случаем, когда вам не нужно ссылаться на тип, который увеличивает число, и вам не нужно давать емуимя.

1 голос
/ 29 марта 2012

Весь смысл параметра типа, такого как T, заключается в том, что вы можете использовать его как тип внутри класса. Что бы там значил подстановочный знак? Если вы нигде не можете его использовать, зачем вообще нужен параметр типа?

0 голосов
/ 28 марта 2012

Для объявлений общего класса и интерфейса требуются параметры типа, такие как T или U.? подстановочный знак, лучше использовать для параметров метода, которые сами являются общими:

class Foo<T extends Number & List> {
    void doStuff(List<T> items) {
        // ...
    }

    void doMoreStuff(List<? extends OutputStream> streams) {
        // ...
    }
}

doStuff () указывает, что он хочет работать с List<T>, где T - параметр типа в классе Foo. Итак:

class Weird extends Number implements List {
    //
}

Foo<Weird> f = new Foo<Weird>();
f.doStuff(...);   // wants a List<Weird>

Если бы мы вызвали doMoreStuff () для f, мы могли бы передать что-то типа List<OutputStream>, List<FilterOutputStream>, List<ByteArrayOutputStream> и т. Д.

...