[英]Use java.util.Properties in Frege
我正在嘗試使用frege.java.Util
模塊構造一個Properties
實例。 這是代碼:
module frege_test.Application where
import frege.java.Util (Properties)
main :: [String] -> IO Int
main _ = do
properties <- Properties.new ()
return 0
無法編譯,這是編譯器錯誤:
E T:\Temp\frege-test\src\main\frege\Application.fr:7: overloaded new is ambiguos at type ()→IO t17332
It could mean one of
Properties.newα :: ∀ s.() → STMutable s Properties
Properties.newβ :: ∀ s.Mutable s Properties → STMutable s Properties
Util.Hashtable.newα :: ∀ s k v.() → STMutable s (Util.Hashtable k v)
Util.Hashtable.newβ :: ∀ s k v.Int → STMutable s (Util.Hashtable k v)
Util.Hashtable.newγ :: ∀ s k v.Int → Float → STMutable s (Util.Hashtable k v)
Util.Hashtable.newδ :: ∀ s k v.Mutable s (Util.Map k v) → STMutable s (Util.Hashtable k v)
frege_test.Application: build failed because of compilation errors.
這是怎么回事? 我什Util.Hashtable
沒有導入Util.Hashtable
。 我該如何解決這種歧義?
嗯,這是能夠使用Java重載的方法的結果。 盡管在大多數情況下重載具有相同的含義時,此方法都不會出現任何問題,但在其他情況下,如果沒有額外的類型注釋,它就不會總是起作用。 在沒有其他有關變量properties
應具有的信息的情況下(如上述情況),則更是如此。
最簡單的快速修復方法是從錯誤消息中選擇要使用的過載類型並寫入
properties <- (Properties.new :: () → STMutable s Properties) ()
但是,當您經常需要一個空的屬性列表時,以下方法會更好:
emptyProps :: ST s (Mutable s Properties)
emptyProps = Properties.new ()
之所以可行,是因為類型注釋為編譯器提供了足夠的信息來選擇正確的重載。 您可以像這樣使用它:
main _ = do
p <- emptyProps
...
return 0
關於Util.Hashtable
:自從導入frege.java.Util
以來,定義的所有數據類型和函數都可用,並且可以使用限定名稱(如Util.Hashtable
進行訪問。
由於某種原因,編譯器認為您可能需要這些。 也許是因為它知道java.util.Properties是java.util.Hastable的子類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.