В Java границы переменных типа могут присутствовать только в объявлении переменной типа, верно? - PullRequest
3 голосов
/ 23 января 2011

Границы переменных типа могут появляться только в объявлении классов, интерфейса, методов и конструкторов?

Или можно связать переменную типа, когда они используются в качестве аргументов типа?1005 * Редактировать: Пример:

class MyClass<T extends Number> { // T is bounded by the interface Number
    // can a bounded Type Parameter appear anywhere else,
    // besides the Type parameter declaration?
}

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Спецификация языка Java , похоже, согласна с вами:

Переменная типа (§4.4) является неполным идентификатором.Переменные типа представляются объявлениями универсального класса (§8.1.2), объявлениями универсального интерфейса (§9.1.2), объявлениями универсального метода (§8.4.4) и объявлениями универсального конструктора (§8.8.4).

2 голосов
/ 23 января 2011

Рассмотрим этот статический метод:

public static <T> List<T> filter(final List<T> orig, final Predicate<T> pred) {
  return new ArrayList<T>() {{
    for (T t : orig) if (pred.allow(t)) add(t);
  }};
}

«Значение» «Т» «связано» каждым вызовом.Теперь, это не действительно связано в то время, когда метод вызывается;он «связан» во время компиляции путем проверки статических особенностей каждого вызова, как это происходит в другом месте.

Таким образом, если где-то я называю это так:

final List<Integer> numbers = Whatever.filter(origList, new Predicate<Integer>() {
  public boolean allow(Integer i) {
    return i != null && i.intValue() > 0;
  }
});

, тогда «T»"Integer".

1 голос
/ 23 января 2011

Да.Границы типа применяются в объявлении переменной типа.

Другими словами - когда переменная типа появляется впервые.

public class MyClass<T extends MyItem> { // <- Type declaration

   private T item; // <-  Type usage

   public <K extends T> K getSubitem() {
   //      ^            ^ 
   //  declaration    usage   
     ...
     Arrays.<K>asList(); // <- Type Usage not a type declaration
   } 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...