Из-за стирания вы не можете. О том, что вы можете сделать, это сохранить в классе кортежа тип, который вы планируете удерживать Tuple в элементе поля «java.lang.Class». Затем вы можете сравнить эти поля, чтобы убедиться, что класс кортежа поддерживает одни и те же типы.
Также см эту тему: What is the equivalent of the C++ Pair<L,R> in Java?
Это поможет, если вы разместите больше о своем классе. Я думаю, что неконтролируемый актерский состав и ваше количество полей, которые вы приравниваете, означает, что он должен быть Tuple < E, F > нет?
EDIT: здесь полезный класс Pair, который я использую регулярно (при необходимости вы можете адаптировать свой класс Tuple). Обратите внимание, что аналогичные предложения других людей этот класс просто позволяет содержащимся членам решать вопрос о равенстве. Ваш вариант использования - это то, что должно определить, действительно ли равенство основано на типе содержащихся элементов.
/**
* Adapted from http://forums.sun.com/thread.jspa?threadID=5132045
*
*
* @author Tim Harsch
*
* @param <L>
* @param <R>
*/
public class Pair<L, R> {
private final L left;
private final R right;
public R getRight() {
return right;
} // end getter
public L getLeft() {
return left;
} // end getter
public Pair(final L left, final R right) {
this.left = left;
this.right = right;
} // end constructor
public static <A, B> Pair<A, B> create(A left, B right) {
return new Pair<A, B>(left, right);
} // end factory method
@Override
public final boolean equals(Object o) {
if (!(o instanceof Pair<?,?>))
return false;
final Pair<?, ?> other = (Pair<?, ?>) o;
return equal(getLeft(), other.getLeft()) && equal(getRight(), other.getRight());
} // end method
public static final boolean equal(Object o1, Object o2) {
if (o1 == null) {
return o2 == null;
}
return o1.equals(o2);
} // end method
@Override
public int hashCode() {
int hLeft = getLeft() == null ? 0 : getLeft().hashCode();
int hRight = getRight() == null ? 0 : getRight().hashCode();
return hLeft + (37 * hRight);
} // end method
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('<');
if(left == null) {
sb.append("null");
} else {
sb.append(left.toString());
} // end if
sb.append(',');
if(right == null) {
sb.append("null");
} else {
sb.append(right.toString());
} // end if
sb.append('>');
return sb.toString();
} // end method
} // end class
Кстати, эта логика не означает, что «a», «a» и «a», «b» равны? Не было бы проще просто написать «если a0 = a0 и a1 = a1, или a0 = a1 и a1 = a0 ...» –
Если вы допустили, чтобы ваши a0 и a1 были пустыми, убедитесь, что вы добавили проверки для этого. –