В соответствии с природой языка Java, я полагаю, что людям на самом деле не требуется Pair
, интерфейс, как правило, то, что им нужно. Вот пример:
interface Pair<L, R> {
public L getL();
public R getR();
}
Итак, когда люди хотят вернуть два значения, они могут сделать следующее:
... //Calcuate the return value
final Integer v1 = result1;
final String v2 = result2;
return new Pair<Integer, String>(){
Integer getL(){ return v1; }
String getR(){ return v2; }
}
Это довольно легкое решение, и оно отвечает на вопрос «Какова семантика Pair<L,R>
?». Ответ таков: это интерфейсная сборка с двумя (может быть разными) типами, и у нее есть методы для возврата каждого из них. Это зависит от вас, чтобы добавить дополнительную семантику к нему. Например, если вы используете Position и действительно хотите указать это в своем коде, вы можете определить PositionX
и PositionY
, которые содержат Integer
, чтобы создать Pair<PositionX,PositionY>
. Если JSR 308 доступен, вы также можете использовать Pair<@PositionX Integer, @PositionY Ingeger>
, чтобы упростить это.
EDIT:
Здесь я должен указать одну вещь: вышеприведенное определение явно связывает имя параметра типа и имя метода. Это ответ на те аргументы, что Pair
- это недостаток семантической информации. На самом деле, метод getL
означает «дать мне элемент, соответствующий типу параметра типа L», что означает что-то.
EDIT:
Вот простой вспомогательный класс, который может облегчить жизнь:
class Pairs {
static <L,R> Pair<L,R> makePair(final L l, final R r){
return new Pair<L,R>(){
public L getL() { return l; }
public R getR() { return r; }
};
}
}
использование:
return Pairs.makePair(new Integer(100), "123");