Problema de borrado de tipo Java

He hecho un ejemplo para demostrar mi problema:

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; }
}

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

    }
}

Entonces, enAlgoritmo.java, Establecer <Par <T >> está siendo visto como unConjunto <T> Y por eso estoy teniendo problemas de borrado de tipos. Sin embargo, ¿hay alguna manera de que pueda salir adelante con algo como esto sin nombrar los métodos de manera diferente? Ambas variantes del algoritmo están destinadas a operar enT's, pero necesito permitir diferentes argumentos. Ellos calculan la misma cosa, por lo que en un esfuerzo por evitar la confusión, preferiría no nombrarlos de manera diferente. ¿Hay alguna manera de acomodar esto?

Respuestas a la pregunta(5)

Su respuesta a la pregunta