(In this discussion I suppose it’s probably OK to ignore the multicast feature of delegates.)
update — see java lambda and Single-Abstract-Method interface on http://www.oracle.com/technetwork/articles/java/lambda-1984522.html
I used to feel a (unicast) delegate TYPE is quite similar to a SAM interface. Now I doubt it.
C++ has abstract classes. When all the methods are pure virtual, that’s an interface (as in java). In this tradition, an interface is typically implemented by a Stateful class. Most textbooks and most schools introduce interface of this kind. What if the implementation class is stateless?
(To keep things simple let’s suppose there’s just 1 method.) Then the objects needed by the method must be passed in. This feels like a static utility method without the static keyword. Such an interface is quite a different animal from the traditional interface. A non-capturing Lambda is the best example. But also
– static nested classes in java
– anonymous delegates
Where c# API uses a lambda, java often uses a SAM interface, since Java didn’t support lambda until Java 8.
I feel in both c# and c++, lambda is often used as a function argument (not “parameter”). Imagine you have a method parameter whose type is an SAM interface,
– and this interface has just 1 (or few) implementation(s)
– and the instance of this implementation class is basically stateless,
then this SAM parameter is probably a lambda trapped in an SAM. C# 3.0 and c++11 would set it free.