2017-06-05 133 views
0

我是在java中使用泛型的新手,我有簡單的方法,我想返回任何類型,此方法返回其他類getters方法,例如我有channels類,並且有getChannelId()方法,我想返回,從這個方法:Java返回類型通用

@SuppressWarnings("unchecked") 
public <T extends Channels> T getChannelColumn(ChannelContentModel.channelColumns column) { 
    switch (column) { 
     case id: 
      return (T) channel.getId(); 
     break; 
     case title: 
      return (T) channel.getChannelTitle(); 
      break; 
    } 
    return null; 
} 

getId是int和getChannelTitle是字符串,我怎麼能解決這個問題的方法返回任何類型?

在我的代碼 channel

Channels類的實例,在此先感謝

+1

的Java是靜態類型的一類。這使得寫一個方法不可能在不同情況下返回一個int或String。它只有在有一個超類型的'int'和'String'時纔有效。 – GeckStar

+0

什麼是一個潛在的調用者用一個方法的retun值做些什麼,有時會返回一個int,有時還會返回一個字符串? – pvg

回答

0

正如評論說@Geckstar;

的Java是靜態類型

但它有可能從編譯錯誤的清除您的代碼示例。

  1. 刪除中斷,因爲在return語句後不需要中斷。
  2. 從對象擴展返回類型。 Ť延伸對象代替Ť延伸通道
  3. ID必須是整數,不是int或更改爲(T)(整數)channel.getId()

這不是一個很好的解決方案,它僅修正編譯錯誤。但此方法的使用可能會導致運行時失敗。

@SuppressWarnings("unchecked") 
public <T extends Object> T getChannelColumn(ChannelContentModel.channelColumns column) { 
    switch (column) { 
     case id: 
      return (T) channel.getId(); //int must be Integer 
     case title: 
      return (T) channel.getChannelTitle(); 
    } 
    return null; 
} 
+0

我收到'不可轉換的'錯誤'return(T)channel.getId(); ' –

+0

你是否檢查過channel.getId()方法,它必須返回Integer而不是int或者像(T)(Integer)channel.getId()那樣強制轉換。 –

+0

負面所有者,請給予幫助新手的最佳答案。請不要把負面和跑掉 –

0

您可以創建屬性包裝要求它會轉換爲特定數據類型時,其將持有的字符串數據格式的值。

public class MyProperty { 
private String stringVal; 

public MyProperty(String stringVal) { 
    this.stringVal = stringVal; 
} 

public Integer getInteger() throws IllegalArgumentException { 
    return integerValue.getValue(); 
} 

public String getString() { 
    return stringValue.getValue(); 
} 

private PropertyValue<String> stringValue = new PropertyValue<String>() { 
    protected String parse(String rep) { 
     return rep; 
    } 
}; 
private PropertyValue<Integer> integerValue = new PropertyValue<Integer>() { 
    protected Integer parse(String rep) throws NumberFormatException { 
     return Integer.valueOf(rep); 
    } 
}; 

private abstract class PropertyValue<T> { 
    private T value; 

    protected abstract T parse(String rep) throws Exception; 

    public T getValue() throws IllegalArgumentException { 
     try { 
      value = (stringValue == null) ? null : parse(stringVal); 
     } catch (Exception e) { 
      value = null; 
     } 
     return value; 
    } 
} 

}

你可以專攻類或具有訪問方法與指定的數據類型來獲取值

@SuppressWarnings("unchecked") 
    public MyProperty getChannelColumn(ChannelContentModel.channelColumns column) { 
     switch (column) { 
      case id: 
       return new MyProperty(channel.getId());// 
      break; 
      case title: 
       return new MyProperty(channel.getChannelTitle()); 
       break; 
     } 
     return null; 
    } 
+0

謝謝,現在我怎麼能返回'渠道'值? –

+0

所有值將被包裹在PropertyValue.So你將返回PropertyValue和客戶端類將獲得所需的值像int,字符串 –

+0

你能舉一個例子來知道我該怎麼做? –