我举了一个例子来说明我的问题:
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上操作的,但我需要考虑不同的参数。他们计算相同的东西,所以为了避免混淆,我宁愿不给它们起不同的名字。有什么办法可以容纳这个吗?
发布于 2009-07-10 00:37:11
不没有。
您必须记住,有人只需一组香草就可以调用您的方法,在这种情况下,将调用哪个方法?
所以你不能这么做。就像你做不到的那样:
interface A {
void blah(Set set);
void blah(Set<T> set);
}同样的问题。
类型信息在运行时不可用(即类型擦除)。
发布于 2009-07-10 00:38:16
对不起,坏消息是你不能这样做:
public class Algorithm<T extends Metrical<T>> {
public void compute(Set<T> objects) {
}
public void compute(Set<Pair<T>> pairs) {
}
}由于擦除,两者将擦除到相同的签名。除了重命名其中一种方法之外,没有其他办法可以避免。
发布于 2009-07-10 00:38:19
可悲的是,这是Java泛型崩溃的主要领域.没有好的解决办法。
我通常求助于创建一个新类,其接口为Set<Pair<T>>,但它封装了Set<Pair<T>> (不对其进行扩展,这将导致同样的问题)。
https://stackoverflow.com/questions/1107139
复制相似问题