小编ban*_*csy的帖子

Scala:为什么PECS原则不适用于Function1?

在Effective Java中,Joshua Bloch讨论了PECS(Producer-Extends,Consumer-Super)的原理.

我对此的理解是,为了提高API的灵活性,输入(产生的集合)应该是协变的,输出(消耗的集合)应该是逆变的.

实现此原则的函数可以具有以下签名:

private static void func( ArrayList<? extends Object> input, ArrayList<? super Integer> output)
Run Code Online (Sandbox Code Playgroud)

但是,在Scala中,Function1特征具有以下签名:

trait Function1[-T1, +R] extends AnyRef
Run Code Online (Sandbox Code Playgroud)

T1(输入类型)是逆变的,而R(输出类型)是协变的.

我的理解是否正确?如果是这样,为什么PECS不适用于Scala的Function1特性?

scala

3
推荐指数
2
解决办法
401
查看次数

如何使用cv-qualifier调用重载成员函数?

我一直在阅读C ++标准,从那里我发现cv限定词是成员函数的函数签名的一部分。

考虑以下情况:

/******************************
* Function signature testing
*******************************/
class Signature
{   
public:
    void vSignature( void )
    {
        cout << "signature" << endl;        
    }

    void vSignature( void ) const 
    {
        cout << "constant signature" << endl;
    }
};

typedef void (Signature::*constFunc)( void ) const ;
int main(void)
{
    constFunc f = &Signature::vSignature;
    Signature s;
    s.vSignature();  //outputs 'signature'
    (s.*f)();        // outputs 'constant signature'
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我以“普通”方式调用vSignature时,将调用非常量重载。为了“强制”要使用的const重载,我必须获得指向vSignature函数的指针并将其强制转换为const重载。

除了上述方法以外,还有其他方法可以调用vSignature()const重载吗?

c++

0
推荐指数
1
解决办法
968
查看次数

标签 统计

c++ ×1

scala ×1