Проблема стирания типа Java

Я сделал пример, чтобы продемонстрировать свою проблему:

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< Pair< T >> рассматривается какSet< T > и, таким образом, у меня возникают проблемы со стиранием типов. Тем не менее, есть ли способ, которым я могу избежать такого, не называя методы по-другому? Оба варианта алгоритма предназначены для работы наT's, но мне нужно учесть другие аргументы. Они вычисляют одно и то же, поэтому, чтобы избежать путаницы, я бы не стал называть их по-другому. Есть ли способ приспособиться к этому?

Ответы на вопрос(5)

Ваш ответ на вопрос