代码之家  ›  专栏  ›  技术社区  ›  retronym

为什么类的第一个参数列表不能是隐式的?

  •  18
  • retronym  · 技术社区  · 14 年前
    scala> class A(implicit a: Int);
    defined class A
    
    scala> class B()(implicit a: Int);
    defined class B
    
    scala> new A()(1)
    res1: A = A@159d450
    
    scala> new B()(1)
    res2: B = B@171f735
    
    scala> new A(1)
    <console>:7: error: too many arguments for constructor A: ()(implicit a: Int)A
           new A(1)
    

    这似乎是一个功能,而不是一个错误,从 commentary in the scalac sources :

    //转换(隐式…)到 ()(隐式…)如果这是唯一 参数部分

    我很想知道为什么要这样做。我觉得很奇怪。

    2 回复  |  直到 14 年前
        1
  •  7
  •   venechka    14 年前

    在我看来,隐式参数列表并不能取代常规参数列表。因为对于构造函数定义,至少需要一个参数列表,如果没有显式指示,则生成“()”。

    虽然这可能确实令人费解,但它与在根本不存在参数列表的情况下生成空构造函数是一致的。

        2
  •  5
  •   Community holdenweb    7 年前

    好吧,在@venechka's的帮助下 answer ,我想我已经弄明白了。

    对于普通类,Scala在类声明处推断并清空参数列表( class B ),或在类实例化时( new A new B

    scala> class A()
    defined class A
    
    scala> new A
    res19: A = A@12cdd20
    
    scala> new A()
    res20: A = A@1c37b8f
    
    scala> class B
    defined class B
    
    scala> new B
    res21: B = B@12801c5
    
    scala> new B()
    res22: B = B@79a340
    

    class D(implicit ...) ).

    scala> class C()(implicit a: Int = 0)
    defined class C
    
    scala> new C
    res23: C = C@9d1714
    
    scala> new C()
    res24: C = C@b38dba
    
    scala> new C()(0)
    res25: C = C@1677979
    
    scala> class D(implicit a: Int = 0)
    defined class D
    
    scala> new D
    res26: D = D@1a0d111
    
    scala> new D()
    res27: D = D@14e3372
    
    scala> new D()(0)
    res28: D = D@1609872