2010-11-10 139 views
23

整個泛型的東西是有點扔我循環,更RTT。Java isInstance vs instanceOf運營商

Specificis?不錯啊,這裏的要點是:

enum QueryHelper { 
    query1, 
    query2; 
    static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { 
    if (expectedReturn.isInstance (SomeRelatedClass.class)) 
     return query1; 
    else 
     return query2; 
    } 
} 

,然後我會叫它像這樣:

... 
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class); 
... 

這是這樣,我真的可以靈活地分配在實際的助手查詢返回類型。它做了一些鑄造和對象創建。我所看到的是沒有匹配,我是否應該以其他方式做這件事?或者整個想法很糟糕?

而這真正的核心是,我不明白class.isInstance和instanceOf運算符之間的區別?我應該使用後者嗎?

回答

29

這這樣我就可以在實際的幫助器中真正靈活地分配查詢返回類型。

沒有什麼靈活關於這個方法

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { 
    if (expectedReturn.isInstance (SomeRelatedClass.class)) 
     return query1; 
    else 
     return query2; 
} 

總是返回的QueryHelper實例的返回類型。如果你想返回類型要靈活,你就需要把它定義爲是這樣的:

static <T> T getQueryHelper (Class<T> expectedReturn) { 
} 

現在的返回類型是靈活的,因爲這將取決於參數的類型

而且這真正的核心是我不明白class.isInstance和instanceOf運算符之間的區別嗎?

不同的是,的instanceof做了類型檢查,其固定在編譯時,例如:

static boolean isInstance(Object myVar) { 
    return (myVar instanceof Foo); 
} 

將總是檢查myVar的是富的一個實例,而

static <T> boolean isInstance(Object myVar, Class<T> expectedType) { 
    return expectedType.isInstance(myVar); 
} 

將檢查myVar是expectedType的實例,但預期類型可能是每次調用該方法時的不同類型

+0

您的用法ex因爲isInstance是落後的。預期的是Type.isInstance(myVar); – Affe 2010-11-10 00:34:10

+0

感謝您澄清 - 我需要放慢速度,並認爲當我寫這段代碼。它已經改變了形狀,實際上是有用的。再次感謝! – rybit 2010-11-16 18:28:25

1

isInstance的預期參數是一個對象,它可能是類對象所表示的類的實例。你正在比較的是該班的一個實例... java.lang.Class!所以它不會匹配。

例如,將是真實的:

Class.class.isInstance(SomeRelatedClass.class); 

也將是真實的(不含建築評上的實際構建您的查詢助手這樣的理智)

expectedReturn.isInstance(new SomeRelatedClass()); 
3

Class.isInstance()沒有按不像你的代碼期望的那樣工作。它測試你傳遞給它的對象是否是該類的一個實例。在你的代碼中:

expectedReturn.isInstance(SomeRelatedClass.class) 

你傳遞的對象是一個Class對象。試試這個,它返回true:

Class.class.isInstance(SomeRelatedClass.class); 

什麼,你可能尋找的是Class.isAssignableFrom(),如:

Object.class.isAssignableFrom(Class.class); 

意味着你可以這樣做:

Class klass = ...; 
Object o = klass;