泛型類的繼承與包含關係中的未指定標籤

2021-08-25 01:18:13 字數 2065 閱讀 5959

1.繼承

就繼承關係而言,派生類的未指定引數型別標籤必須包含所有父類未指定引數型別,否則報錯。原因在於,如果派生類的引數型別標籤沒有涵蓋父類的引數型別標籤,則例項化派生類的時候,其父類的未指明具體型別的標籤仍然無法指定具體型別,所以產生錯誤。以下是幾種常見的繼承情況:

class

basenode

class

basenodegeneric

// concrete type

class

nodeconcrete: basenode

//closed constructed type

class

nodeclosed: basenodegeneric<

int>

//open constructed type 

class

nodeopen: basenodegeneric

//no error

class

node1 : basenodegeneric<

int>

//generates an error

//class node2 : basenodegeneric{}

//generates an error

//class node3 : t {}
class

basenodemultiple

//no error

class

node4: basenodemultipleint

>

//no error

class

node5: basenodemultiple

class 

sampleclass1: ibaseinte***ce1

//no error

class 

sampleclass2: ibaseinte***ce2

//no error

//generates an error

//class node6: basenodemultiple{} 

class

nodeitemwhere t : system.icomparable,

new()

class

specialnodeitem: nodeitemwhere t : system.icomparable,

new()

class

superkeytype

where u : system.icomparable
where v : 

new()

2.包含關係

當乙個泛型類的例項作為另乙個類的成員時,必須保證外層的泛型類的引數型別標籤涵蓋內層泛型類的引數型別標籤。以下面的**為例,myclass類的引數型別標籤,必須包括node泛型類的標籤t。除非node類的標籤已經具體化,如指定t為string等,否則必須遵循這條原則。

class myclass

下面這個例子為錯誤例子:

//error,例項化myclass時,node的標籤無法具體化。

class myclass

但下面這個例子是正確的

//right,node類已經指明t的具體型別

class myclass

總結:繼承關係,子類未知標籤必須涵蓋父類未知標籤,就標籤種類而言,前者是後者的超集;包含關係,外層類的未知標籤必須涵蓋內部類的未知標籤,就標籤種類而言,前者是後者的超集。

泛型與繼承的關係,萬用字元

1 若類a是類b的子類,那麼list就不是list的子介面 2 萬用字元 list a list b 都是list的子類 extends a 可以存放a及其子類 super a 可以存放a及其父類 test 泛型與繼承 public void test4 public void getlist li...

Java泛型 繼承中型別變數的關係

通過例子來看泛型類在繼承中過程中型別變數應該具有怎樣的關係。首先給出幾個輔助類 package generic public class animal package generic public class person extends animal public string getname p...

帶有泛型的類如何繼承

public class genericitytst 具有泛型的classa public class classa 繼承泛型 public class classb extends classa 縮小泛型的範圍,是准許的,但是不允許擴大泛型的範圍 public class classc exten...