2013-04-11 75 views
3

爲了好玩,我試圖在Java中實現一個通用的Pair類。我無法用equals如何爲泛型對實現equals?

public class Pair<A, B> 
{ 
    public final A _1; 
    public final B _2; 

    // ... unnecessary details left out ... 

    public boolean equals(Pair<A, B> that) 
    { 
     return (_1.equals(that._1)) && (_2.equals(that._2)); 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     return (o instanceof Pair<A, B>) && equals((Pair<A, B>) o); 
    } 
} 

然而,o instanceof Pair<A, B>似乎並沒有工作。這是爲什麼?

使用(o instanceof Pair) && equals((Pair<A, B>) o)給我演員一個警告。擺脫演員陣容中的<A, B>部分仍然給我一個警告,我想這也是有道理的。

這是否意味着Java無法阻止客戶端將對與不同類型參數進行比較?

+0

難道你不是簡單地問如何使用'instanceof'與paremetrized類型? – djechlin 2013-04-11 19:59:21

+0

我認爲這應該工作,只要'A'和'B'具有良好行爲的'equals()'方法,它應該驗證它們的類是否兼容。問題是'A'和'B'類型在運行時被擦除,在這種情況下本質上被簡化爲'Object'。 – 2013-04-11 19:59:39

回答

6

這是否意味着Java無法阻止客戶端將對與不同的類型參數進行比較?

是的,但這就是要點 - equals應該與任何任意對象一起使用。你想要什麼看起來像

@Override 
public boolean equals(Object o) 
{ 
    if (o instanceof Pair) { 
     Pair<?, ?> pair = (Pair<?, ?>) o; 
     return _1.equals(pair._1) && _2.equals(pair._2); 
    } 
    return false; 
} 

但是,這應該是罰款,只要AB有需要任意Object S的equals正確實施。

+0

但是,您不會使用從'o'投下的'pair'' – Cratylus 2013-04-11 20:03:12

+0

@Cratylus'pair'和'that '可能是同一個變量的兩個名字;) – fredoverflow 2013-04-11 20:33:48

+0

@Cratylus現在修復。 – 2013-04-11 21:17:46

2

由於type erasure的原因,您不能使用instanceof。您只能檢查instanceof Pair
還有什麼與_1_2?真?

+0

'_1'和'_2'是函數式編程語言中成員對的慣用名稱。 – fredoverflow 2013-04-11 20:18:47

+0

@FredOverlow:我懷疑這一點,但在Java中使用是非常規的。 – Cratylus 2013-04-11 20:36:26

+0

在這種情況下:''idiomatic names「.replace(」ma「,」「)';) – fredoverflow 2013-04-11 20:40:21

0
o instanceof Pair<A, B> 

不起作用,因爲仿製藥是不是有在運行,因此instanceof不知道他們。