2015-09-07 18 views
1

在啓動時,我正在讀取.xml文件,並希望在運行時將數據存儲在對象中。編寫自己的包裝類,允許Ints,浮動和字符串

事情是,我不想手動指定每個字段,但使用地圖來存儲不同的值。但

,而不是使用「字符串」或.XML類像「節點」或什麼之類,我想我的地圖是類型:

地圖[StringKey,包裝]其中,包裝可以容納或者一個Int,一個浮點數或一個字符串。

現在像

class Wrapper(val: AnyVal) 
{ 
    def this(val: String) = this(val) 
    def this(val: Int) = this(val) 
    def this(val: Float) = this(val) 
} 

是不是我真正想要的東西。我想100%肯定它是String,Int或Float。

我可以寫一個空構造函數和setter方法,但這很難看。

另一種選擇是將一切都轉換爲字符串 - >不是我想要的。

每當我從Map中檢索/獲取值時,我都希望它手動轉換爲它的類型。一樣,如果它是一個Int有,是這樣的:

val size = cache.get("size").actualType 

應自動是int(也就是說,如果使用鍵「大小」的包裝舉行智力)。

有什麼準備使用,或者我可以巧妙地使用枚舉的任務?

也許有更好的解決辦法,就像我不習慣一些FP-概念(雖然這似乎是OOP的域)

回答

1

的問題是,Scala是靜態類型,即使它有大量有用的類型推斷。它需要在編譯時設置val size的類型。

在以下可能的解決方案中,val values類型爲List[Any],因爲Any是所有可能的返回類型的公共父從case條款:

trait Wrapper 

case class IntWrapper(value: Int) extends Wrapper 

case class StringWrapper(value: String) extends Wrapper 

case class DoubleWrapper(value: Double) extends Wrapper 

val wrappers = List(
    IntWrapper(1), 
    StringWrapper("1"), 
    DoubleWrapper(1.0d) 
) 

val values = wrappers.map{ 
    case IntWrapper(v) => v 
    case StringWrapper(v) => v 
    case DoubleWrapper(v) => v 
} 

在你的代碼的情況下,是什麼您打算如何處理變量size,因爲您不知道它的類型?

+0

你最後一個問題是絕對正確的......我想,我應該把每個值都存儲爲String,並根據需要進行轉換,因爲事先沒有提供信息,自動轉換並不會真正有用。 – Sorona