簡體   English   中英

Java類型擦除問題

[英]Java Type Erasure 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)
    {

    }
}

因此,在Algorithm.java中Set <Pair <T >>被視為Set <T> ,因此我遇到類型擦除問題。 但是,有沒有什么辦法可以在不命名方法的情況下擺脫這樣的事情? 算法的兩種變體都是為了對T進行操作,但我需要允許不同的參數。 他們計算同樣的事情,所以為了避免混淆,我寧願不以不同的名字命名。 有沒有辦法容納這個?

不,沒有。

你必須記住,有人可以用一個香草集調用你的方法,在這種情況下會調用哪一個?

這就是為什么你不能這樣做的原因。 就像你做不到:

interface A {
  void blah(Set set);
  void blah(Set<T> set);
}

同樣的問題。

類型信息在運行時不可用(即類型擦除)。

對不起,壞消息是你不能這樣做:

public class Algorithm<T extends Metrical<T>> {
    public void compute(Set<T> objects) {
    }

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

由於擦除,兩者都將擦除相同的簽名。 沒有辦法解決其中一種方法的重命名問題。

遺憾的是,這是Java Generics倒閉的主要領域......沒有好的解決方案。

我通常使用接口作為Set<Pair<T>>創建一個新類,但是包裝Set<Pair<T>> (不擴展它,這會導致同樣的問題)。

我寫了一篇關於類型擦除的文章,這可能是你感興趣的。 它提供了常見的廣為人知的解決方案,也是解決問題的棘手方法。 我不知道它是否適合你。 無論如何,它包含一些在某些情況下可能有用的技術。

另請參閱: 使用TypeTokens檢索通用參數

我希望它有所幫助。

使用public class Widget<K, P> implements Metrical<K extends Widget<P>>

public double distance(Widget other) {}成為public double distance(Widget<P> other) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM