Problem kasowania typu Java

Zrobiłem przykład, aby zademonstrować mój problem:

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)
    {

    }
}

Więc wAlgorithm.java, Ustaw <Para <T >> jest postrzegany jakoUstaw <T> i dlatego mam problemy z usunięciem typu. Czy jest jednak jakiś sposób, aby uniknąć czegoś takiego bez nazywania metod inaczej? Oba warianty algorytmu mają działaćT, ale muszę pozwolić na różne argumenty. Obliczają to samo, więc starając się uniknąć nieporozumień, wolałbym ich nie nazywać inaczej. Czy jest jakiś sposób na to?

questionAnswers(5)

yourAnswerToTheQuestion