2016-05-30 33 views
3

我有功能返回類的類型,並有一流的類型作爲參數

private Class readObject (ObjectInput in, Class objectclass){ 
    try { 
     Object o = in.readObject(); 

     if (o instanceof objectclass) { 
      return (objectclass)o; 
     } 

    } catch (Exception e) { 

} 

在我的課堂我打電話這個功能:

ObjectInput in = (..) 
Type1 type = readObject (in, Type1.class); 
(do something with type) 
while(true){ 
    Type2 type2 = readObject (in, Type2.class); 
    (do something with type2) 

基本上的readObject應該返回的類,我作爲參數,如果這是Object o的正確類型。你可以這樣想,我有我正在閱讀的Type1,Type2和Type3對象,但是如果我遇到Type3,我什麼都不做。

我寫的這段代碼無法正常工作。例如,

Type1 type = readObject (in, Type1.class); 

給我警告「無法從Class轉換爲Type1」。

+0

你有三個不同的等級叫' Class','Type1'和'Type2'? – Gendarme

+0

Type1和Type2是類別yes。 「班級」是我嘗試返回班級的方式。我也試過類和類,似乎沒有幫助 – hokosha

+0

由於返回類型必須是'Type1'或'Type2'的實例,但您返回'Class'的實例 – Clayn

回答

8

你應該讓你的方法仿製並返回一個實例的T(而不是Class<T>一個實例):

private <T> T readObject (ObjectInput in, Class<T> objectclass) 

編輯:你也應該改變你的if和你的施法,具體如下:

if (objectclass.isInstance(o)) { 
    return (T) o; 
} 
+0

我試過了。 'return(objectclass)o;'不起作用 – hokosha

+0

@hokosha怎麼樣'返回(類)o;'? – StephaneM

+0

你應該像'T'一樣投擲:'return(T)o;' –

3

你有兩件事情要做:

  1. 改變你的方法的簽名爲未來:

    private <T> T readObject (ObjectInput in, Class<T> objectclass) {

  2. 投你的對象使用動態Class.cast作爲未來:

    return objectclass.cast(o);

相關問題