首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java类型擦除问题

Java类型擦除问题
EN

Stack Overflow用户
提问于 2009-07-10 00:33:53
回答 5查看 2.6K关注 0票数 2

我举了一个例子来说明我的问题:

Metrical.java

代码语言:javascript
复制
public interface Metrical<T>
{
    double distance(T other);
}

Widget.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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上操作的,但我需要考虑不同的参数。他们计算相同的东西,所以为了避免混淆,我宁愿不给它们起不同的名字。有什么办法可以容纳这个吗?

EN

回答 5

Stack Overflow用户

发布于 2009-07-10 00:37:11

不没有。

您必须记住,有人只需一组香草就可以调用您的方法,在这种情况下,将调用哪个方法?

所以你不能这么做。就像你做不到的那样:

代码语言:javascript
复制
interface A {
  void blah(Set set);
  void blah(Set<T> set);
}

同样的问题。

类型信息在运行时不可用(即类型擦除)。

票数 4
EN

Stack Overflow用户

发布于 2009-07-10 00:38:16

对不起,坏消息是你不能这样做:

代码语言:javascript
复制
public class Algorithm<T extends Metrical<T>> {
    public void compute(Set<T> objects) {
    }

    public void compute(Set<Pair<T>> pairs) {
    }
}

由于擦除,两者将擦除到相同的签名。除了重命名其中一种方法之外,没有其他办法可以避免。

票数 3
EN

Stack Overflow用户

发布于 2009-07-10 00:38:19

可悲的是,这是Java泛型崩溃的主要领域.没有好的解决办法。

我通常求助于创建一个新类,其接口为Set<Pair<T>>,但它封装了Set<Pair<T>> (不对其进行扩展,这将导致同样的问题)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1107139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档