【发布时间】:2009-07-10 00:33:53
【问题描述】:
我做了一个例子来说明我的问题:
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; }
}
算法.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 进行操作,但我需要允许不同的参数。它们计算相同的东西,所以为了避免混淆,我宁愿不给它们起不同的名字。有没有办法解决这个问题?
【问题讨论】:
-
从技术上讲,这不是擦除问题。重载是在编译时完成的。添加额外的运行时类型信息也无济于事。
标签: java generics types type-erasure