2013-05-27 78 views
0

我發現了一個如下所示的方法。Class <?繼承父類>是什麼意思?

public void simpleTest(Class <? extends ParentClass> myClass){ 

} 

我不明白的表達:Class <? extends ParentClass> myClass這裏。

誰能解釋一下嗎?

+1

您想詳細說明嗎? –

+2

你的意思是你不理解通配符「?」 –

回答

5

Class <? extends ParentClass> myClassmethod argument,其類型爲Classparameterized保證什麼傳遞是表示某種類型的父類是一個subtype一類。

即給定:

class ParentParentClass {} 
class ParentClass extends ParentParentClass {} 
class ChildClass extends ParentClass {} 
class ChildChildClass extends ChildClass {} 

public void simpleTest(Class <? extends ParentClass> myClass) {} 

這些都是有效的:

simpleTest(ParentClass.class); 
simpleTest(ChildClass.class); 
simpleTest(ChildChildClass.class); 

這些都不是有效的,因爲參數不 「適合」 所需要的類型中:

simpleTest(ParentParentClass.class); 
simpleTest(String.class); 
simpleTest(Date.class); 
simpleTest(Object.class); 
0

java.lang.Class<T>的Javadoc:

筆 - 此Class對象建模的類的類型。例如,String.class的類型是Class<String>。如果正在建模的類未知,則使用Class<?>

現在將String替換爲您的類:它是一個類型爲Class的ParentClass或ParentClass的子類。

0

類myClass - 意味着myClass應該是ParentClass的子類型。

class MyClass extends ParentClass { 
} 

simpleTest(ParentClass.class); // this is ok 
simpleTest(MyClass.class); // this is ok 

class SomeOtherClass { 
} 
simpleTest(SomeOtherClass.class); // will result in compiler error 
0

這是一個採用參數化類的通用方法。

首先考慮一個更簡單的泛型例子可能會有所幫助:List<? extends ParentClass>意味着它是一個僅使用滿足與ParentClass的is-a關係的對象的List。即List實現的參數是一個ParentClass,但是整個事物List<? extends ParentClass>的類型是List。

在你的例子中,只需要用「Class」而不是「List」來代替。 myClass是一個類,即你可以用類似「MyClassName.class」的方法調用該方法。此外,我的類的參數是一個ParentClass。這基本上意味着您只能將該類的ParentClass或其子類傳遞給該方法。

另請參閱:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html