2015-08-15 99 views
-2

我有2個班我如何比較兩個對象

class Immutable { 
    public int i; 
    public static Immutable create(int i){ 
     return new Immutable(i); 
    } 
    private Immutable(int i){this.i = i;} 
    public int getI(){return i;} 
} 

class Immutable1 { 
    public int i; 
    public static Immutable1 create(int i){ 
     return new Immutable1(i); 
    } 
    private Immutable1(int i){this.i = i;} 
    public int getI(){return i;} 
} 

兩者有相同的方法和相同的實例變量。根據我的理解,這個類的狀態是相同的(int i),並且兩者具有相同的行爲(相同數量的方法)

因此,一個是另一個的精確副本。

在,如果我做

Immutable immutable=Immutable.create(1); 
    Immutable1 immutable1=Immutable1.create(1); 
    immutable1=immutable;// I get error here 

的錯誤是類型不匹配其他類:無法從不可改變轉換爲Immutable1

+0

我請求後還是downvote – rocking

+0

@ user2864740你可以添加一個答案嗎? – rocking

+0

@SotiriosDelimanolis而不是浪費時間編輯我的問題,難道不好回答?你在編輯時沒有賺到任何東西,但是我鬆動了 – rocking

回答

1

Java使用nominative typing(只有名字,什麼被宣佈爲繼承/實現什麼事)。問題是描述structural typing哪個Java支持而不是

在這種情況下有一個瑣碎類型錯誤,因爲在不可變和Immutable1類型之間沒有聲明主格關係

現在,即使有關係,請記住,只有一個子類型可以隱式分配給超類型;如果沒有明確的downcast cast that can fail at run-time,則相反是不可能的。

因此,當且僅當Immutable擴展Immutable1時,當前代碼纔會是類型有效的 - 即。 class Immutable extends Immutable1 ..


安德烈指出另一種解決方案,我很喜歡,這是有兩個類實現相同的interface。這仍然使用nomination類型 - 因爲這兩個類都只是類型相等的,因爲它們都實現了ImmutableInterface - 但是消除了類之間的繼承關係。

interface ImmutableInterface { 
    int getI(); 
} 

class Immutable implements ImmutableInterface .. 
class Immutable1 implements ImmutableInterface .. 

// The resulting object types are implicitly upcast to 
// the common (and named) interface type which is trivially assignable to 
// a variable of the same type; no need to worry about subtypes here. 
ImmutableInterface immutable=Immutable.create(1); 
ImmutableInterface immutable1=Immutable1.create(1); 
immutable1 = immutable; 
+0

即使我做不可變延伸immutable1然後也錯誤**隱式超級構造函數Immutable1()是未定義的。必須顯式調用另一個構造函數** – rocking

+0

@rocking在這種情況下,'fix'將在構造函數的頂部添加'super(i);'並且使父構造函數爲protected,而不是private。 (搜索引起錯誤的原因,因爲沒有重複的短缺。) – user2864740

+0

這兩個類都可以實現相同的接口,例如, 'ImmutableInterface'。在這種情況下,不需要修復構造函數。 – Andrey

0

僅僅因爲類具有相同的屬性和方法聲明,它不意味着他們是同一類。對於Java來說,它們非常獨特,因爲它們有不同的名稱。現在,如果你由於某種原因確實需要兩個(或更多)不同的類,但也能夠以通用的方式使用它們,那麼你應該使它們全部都實現一個公共接口。

0

我不知道你爲什麼想創建兩個不同的類來完成相同的事情,並比較一些實例是否等於... 你知道你可以實例化同一個類中的多個對象嗎?

那麼如果你真的想比較一個Immutable1的實例和一個不可變的實例,你將不得不由你自己決定什麼使它們'等於'。例如,你可以嘗試

public boolean myCustomEqualMethod(Immutable1 i1, Immutable i2){ 
     return i1.getI()==i2.getI(); 
    } 

更重要的是你不要測試與'='的平等。對於原語類型是「==」和其他對象,你必須調用equals方法:

boolean equalsOrNot="chaine1".equals("chaine2"); 
0

用於比較兩個對象,您使用Object類中的equals方法。你想通過創建Immutable類來實現什麼。不可變的對象是你不能像Java中的String那樣改變的對象。如果你改變它像

String str ="XYZ"; 
str="XZY"; 

什麼excatly正在發生的事情是: - STR持有XYZ的內存地址(比如1346),現在海峽拿着這是因爲不同的XZY的內存地址(比如6733)字符串是不可變的。

+0

我同意我正在創建不可變的類,但是我的問題即使都具有相同的屬性仍然爲什麼不能都是相同的? – rocking

+0

爲2個對象賦予相同的值並不會使其與java相等。對於你而言,這可能與java不相等。爲了更好地理解,試着去探索java中HashMap或HashSet中使用的hashCode和equals方法。 –