Я сделал пример, чтобы продемонстрировать свою проблему:
Metrical.java
public interface Metrical<T>
{
double distance(T other);
}
Widget.java
public class Widget implements Metrical<Widget>
{
private final double value;
public Widget(double value) { this.value = value; }
public double getValue() { return value; }
public double distance(Widget other) { return Math.abs(getValue() - other.getValue()); }
}
Pair.java
public class Pair<T>
{
private final double value;
private final T object1, object2;
public Pair(T object1, T object2, double value)
{
this.object1 = object1;
this.object2 = object2;
this.value = value;
}
public T getObject1() { return object1; }
public T getObject2() { return object2; }
public double getValue() { return value; }
}
Algorithm.java
import java.util.Set;
public class Algorithm<T extends Metrical<T>>
{
public void compute(Set<T> objects)
{
}
public void compute(Set<Pair<T>> pairs)
{
}
}
Итак, в Algorithm.java , Set > рассматривается как Set , и поэтому у меня есть тип проблемы стирания. Тем не менее, есть ли способ, которым я могу избежать такого, не называя методы по-другому? Оба варианта алгоритма предназначены для работы с T , но мне нужно учесть разные аргументы. Они вычисляют одно и то же, поэтому, чтобы избежать путаницы, я бы не стал называть их по-другому. Есть ли способ приспособиться к этому?