在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特性?
我一直在阅读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重载吗?