2016-09-07 2 views
1

Я нахожу, что у меня есть метод, который может принимать два типа объектов List <>. Например:Использование обобщений для совместного использования общего метода с несколькими аргументами

public void foo(Long id) {}; 

выше функция будет называться по нескольким объектам, каждый из которых имеет либо идентификатор типа Long или Integer. Что происходит в том, что для объектов, которые имеют их идентификатор определен как Long, этот метод вызова работает просто отлично:

class Bar {Long id} 
Bar test = new Bar(1L); 
foo(bar.id); 

Но для объектов, которые имеют целочисленный идентификатор, я должен сначала преобразовать целое число в Long перед использованием Foo. Конечно, у меня может быть новый метод, который принимает Integer, но Id скорее не сделает этого. Любой способ сделать это с помощью дженериков?

+1

Может ваш метод быть изменен для обработки других числовых типов, такие как '' Double', Float', и т.д? – Bohemian

+1

Любая причина использования 'Long' и' Integer', а не 'long' и' int'? Поскольку случай использования * id * обычно исключает «null», я не вижу ничего, кроме желания столкнуться с проблемой, которую вы описываете. Поскольку, с 'long' и' int', явное преобразование не требуется ... – Holger

ответ

1

Нет. Вы не можете определить тип, который является «ИЛИ» двух типов.

Однако, вы можете принять Number, который включает в себя как Long и Integer типов, а также использовать его longValue() метод:

public void foo(Number number) { 
    Long id = number.longValue(); 
    // rest of code stays the same 
} 
+2

Вы можете добиться того же, объявив параметр как 'long', а затем поместив его в' Long' внутри метода, если это действительно необходимо. У этого есть аккуратный побочный эффект, не позволяющий, например. 'double' или' BigDecimal', в качестве входных данных. – Holger

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