我尝试使用frege.java.Util
module构建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
。我怎么能解决这种歧义?
答案 0 :(得分:1)
嗯,这是能够使用Java中重载的方法的一些结果。虽然大多数情况下,当重载具有相同的arity时,这种方法没有任何问题,但在其他情况下,如果没有额外的类型注释,则无法正常工作。当没有关于变量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的子类型。