首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Frege中使用java.util.Properties

在Frege中使用java.util.Properties
EN

Stack Overflow用户
提问于 2015-03-14 07:45:51
回答 1查看 90关注 0票数 1

我正在尝试使用 module来构造一个Properties实例。下面是代码:

代码语言:javascript
复制
module frege_test.Application where

import frege.java.Util (Properties)

main :: [String] -> IO Int
main _ = do
  properties <- Properties.new ()
  return 0

如果没有编译,下面是编译器错误:

代码语言:javascript
复制
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。我怎样才能解决这个模棱两可的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-14 12:44:31

这是能够使用Java中重载的方法的结果。虽然这在大多数情况下没有任何问题,但在其他情况下,在没有额外类型注释的情况下,重载是不会正常工作的。当没有关于变量properties应该是什么的其他信息时,情况就会更糟,就像上面的情况一样。

最简单的快速修复方法是从错误消息中选择要使用的重载类型,然后写入

代码语言:javascript
复制
properties <- (Properties.new :: () → STMutable s Properties) ()

但是,当您经常需要一个空的属性列表时,下面的情况会更好:

代码语言:javascript
复制
emptyProps :: ST s (Mutable s Properties)
emptyProps = Properties.new ()

这是因为类型注释为编译器提供了足够的信息来选择正确的重载。你就这样用它:

代码语言:javascript
复制
main _ = do
    p <- emptyProps
    ...
    return 0

关于Util.Hashtable:由于您导入了frege.java.Util,所以这里定义的所有数据类型和函数都是可用的,并且可以使用像Util.Hashtable这样的限定名来访问。

出于某种原因,编译器认为您可能需要这些。也许是因为它知道java.util.Properties是java.util.Hastable的一个子类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29046681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档