2012-03-20 143 views
0

java中的兼容/不兼容對象是什麼?什麼是java中兼容的不兼容對象?

+3

你是什麼意思?相等/不相等? – Svilen 2012-03-20 06:20:32

+0

還是你在談論繼承和接口? – home 2012-03-20 06:26:10

+0

從何種意義上說?將一個對象引用分配給另一個對象? – Raj 2012-03-20 06:46:02

回答

1

可能你的意思是comparable而不是compatible?然後...

在常識中,可比對象是同一種「對象」。你可以用某種有意義的方式相互比較。

例如,您可以通過多種因素比較一棟建築物與另一棟建築物:按高度 - 比其他建築物的總面積高一個建築物的空間總面積,或者更爲不尋常的例子是按樓梯長度。

通常,您將設置關於如何比較對象的規則。只要確保這些規則是一致的(當它們適用於任何可比對象的實例時,它們會給出明智的答案):

  • 對象可以與自身進行比較;
  • 比較A到B給出了與B比較A相同的結果;
  • 如果對象A與B相比,並且B與C相比較並且兩個比較都給出了相同的結果,那麼比A相比C必須給出相同的結果;

這是關於一般常識。

在Java中,這個概念可以通過使某種類型來表示,例如Building,實現接口Comparable。該界面表達了與上述概念相同的概念。

Comparable類型的對象必須符合上述規則。

這個概念給你什麼?如果您的對象可以按照上述規則進行比較,並且它們支持接口,則可以對這些對象的集合進行排序!你不需要自己編寫排序算法,因爲Java已經實現了它!

正如您在「建築物」示例中指出的那樣,建築物不僅可以根據其高度進行有意義的比較,而且可以根據其總面積進行比較。由於Comparable對象自然只能表示一種比較,所以需要用其他方式來比較不同的建築物。這種方式由Comparator接口提供,表達了相同的概念,但是在比較對象外部,因此它可以以不同的方式實現 - 您可以有Comparator用於總面積,另一個用於長度等。

對於相當長例如:

import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

class Building implements Comparable<Building> { 
    final int height, totalArea; 
    final String name; 

    Building(int height, int totalArea, String name) { 
     this.height = height; 
     this.totalArea = totalArea; 
     this.name = name; 
    } 

    public int compareTo(Building o) { 
     if (height < o.height) return -1; 
     if (height == o.height) return 0; 
     return 1; 
    } 

    @Override 
    public String toString() { 
     return "Building{" + 
       "height=" + height + 
       ", totalArea=" + totalArea + 
       ", name='" + name + '\'' + 
       '}'; 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     List<Building> buildings = Arrays.asList(
       new Building(100, 5000, "Medium"), 
       new Building(250, 3000, "Very tall"), 
       new Building(50, 4000, "Short"), 
       new Building(150, 3500, "Tall") 
       ); 
     // sort as defined by Object itself -- by height 
     Collections.sort(buildings); 
     System.out.println(buildings); 

     // sort by providing explicit order criteria -- total area 
     Collections.sort(buildings, new Comparator<Building>() { 
      public int compare(Building o1, Building o2) { 
       if (o1.totalArea < o2.totalArea) return -1; 
       if (o1.totalArea == o2.totalArea) return 0; 
       return 1; 
      } 
     }); 
     System.out.println(buildings); 
    } 
} 

最後,不可比較的對象 - 這些是不同種類的,這是不能被自然比較的對象。人們談論這樣的嘗試「不要把蘋果與橘子比較」,或類似的東西。

雖然如果你能想出一種方法來比較蘋果和橘子的符合上面列出的3條規則的目的,那麼你很好!

1

兼容性是關於Java中不同類的對象使用的上下文。一個類的對象汽車不能與類Animal的對象進行比較。

因此,如果您嘗試執行任何操作(如將某個類型的對象轉換爲另一個操作),則會說操作不成功,因爲對象不兼容。