2013-07-25 24 views
0

在閱讀Horstmann's book,我已經在Java中遇到了這個約亞型關係:java的亞型關係

S is a subtype of T if: 

S is an array type and T is Cloneable or Serializable 

我無法真正瞭解這是應該的意思。誰能幫忙?

謝謝!

+1

我覺得你沒有給我們的所有信息 – aaronman

+0

需要更多一點的上下文 – Gus

+0

S和T是同一類型 S和T都是類的類型,T是S的直接或間接超類S是一個類類型,T是一個接口類型,S或它的一個超類實現T和S都是接口類型, 一個nd T是直接或間接超接口S S和T都是陣列類型,S的組件類型是組件類型的子類型T S不是原始類型,T是類型對象 S是空類型,T不是原始類型 這些是子類型關係的其他示例。它有幫助嗎? – sha1

回答

0

這是子類型的一個簡單示例。

Array類型實現了CloneableSerializable接口。

但是,這些接口沒有指定任何方法作爲方法合同的一部分。實際上,這些只是標記接口,它們的存在爲您的類的編譯器和用戶提供了詳細信息,而不直接需要任何功能。

例如:

注意這個接口不包含clone方法。因此,僅憑藉其實現此接口的事實來克隆對象是不可能的。即使克隆方法是反射式調用,也不能保證它會成功。

+0

我熟悉這些接口。但是,我可以將任何數組類型分配給實現Cloneable或Serializable的類,如果存在子類型關係,我應該可以做到這一點? – sha1

+0

@ErcanOzturk實際上可能不是,因爲'java.lang.reflect.Array'沒有實現這些接口,因此你的問題中的語句對於那個位是不真實的。 – hexafraction

+0

那我該如何使用這種子類型關係?我們只是說那裏「是」是一種亞型關係嗎? – sha1

0

我認爲是什麼原因造成你的困惑是,「可複製」和「序列化」是在英語語言屬性,而那句「是Cloneable」通常用來表示一個類實現了Cloneable接口。然而,這裏它們只有只有表示接口名稱CloneableSerializable,並且「is」被理解爲「是」正好是 /等於「。也就是說,如果T是接口Cloneable或者如果T是接口Serializable,則任何陣列類型都是T的子類型。

一種array type是任何類型的形式U[],其中U是任意類型,即非void原始或引用類型(注意,一個數組類型,即使是原始類型的,也就是一個引用類型)。這與java.lang.reflect.Array類沒有任何關係,這是而不是的數組類型!

不能分配任何數組實現CloneableSerializable類的參考變量,但只的恰好類型CloneableSerializable參考變量。因此,如果你有

int[] a = ...; // primitive array 
Object[] b = ...; // reference type array 
int[][] c = ...; // reference type array, since int[] is a reference type 

再下面是合法的:

Cloneable x = a; x = b; x = c; 
Serializable y = a; y = b; y = c;