2015-07-27 2 views
1

Я хочу создать функцию f, которая получает один аргумент n типа Number. Однако я также хочу указать, что n должно быть Comparable (которые не являются AtomicInteger и AtomicLong). Как я могу написать эту функцию?Общая функция с конкретными ограничениями на аргументы

Я пробовал: public static <T extends Number, Comparable<T>> void f(T n), но это не сработало. Как я могу это решить?

ответ

3

Множественные оценки параметров типа должны быть разделены с &, а не ,, например:

public static <T extends Number & Comparable<T>> void f(T n) 

запятой используется для разделения деклараций параметров множественного типа , например:

public static <T extends Number & Comparable<T>, S extends Comparator<T>> void f(T n, S m) 

В соответствии со спецификацией JLS может быть либо:

  • a переменная типа;
  • или класс или интерфейс, за которым следует один или несколько интерфейсов (и разделены &).

Поэтому это работает T extends Number & Comparable<T>, и это не T extends Comparable<T> & Number.

См: JLS § 4.4: Type Variables

AdditionalBound: 
    & InterfaceType 

...

Каждый тип переменной, объявленной в качестве параметра типа имеет предел. Если для переменной типа не объявлена ​​граница, принимается Object. Если граница объявлена, она состоит либо из:

• одного типа переменной T или

• класса или интерфейса типа T возможно с последующим типами интерфейсов I1 & ... & In.

5

Использование & вместо запятой:

public static <T extends Number & Comparable<T>> void f(T n) 
+1

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