groovy-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jochen Theodorou <blackd...@gmx.org>
Subject Re: About the native-lambda branch
Date Sat, 13 Jan 2018 12:39:23 GMT
On 13.01.2018 04:07, Nathan Harvey wrote:
> Sure thing. Here's a Java example:
> 
> 	void sample(Function<String, Integer> fn) {
> 		System.out.println("fn");
> 	}
> 
> 	void sample(Supplier<Integer> sp) {
> 	    System.out.println("sp");
> 	}
> 
> These methods can exist side by side, and are called correctly even in cases
> of Lambda, eg:
> 
> sample(s -> 123); // fn
> sample(() -> 123); // sp
> 
> On the other hand, take this Groovy code:
> 
> 
> ​def sample(Function<String, Integer> fn) {
>      println "fn"
> }
> 
> def sample(Supplier<Integer> sp) {
>      println "sp"
> }

in theory we can resolve this, because we do know how many parameters 
the Closure has and in sample({ s -> 1 }) we know we have one, thus it 
should be the Function. What we cannot do with Closure is the following:

interface I1 {
   String m(String s)
}
interace I2 {
   Integer m(Integer i)
}
def c(I1 i1){}
def c(I2 i2){}
c(i -> i+1)
c(i -> i.toString())

What should not work even in Java is the following:

interface I1 {
   String m(String s)
}
interace I2 {
   String m(Integer i)
}
def c(I1 i1){}
def c(I2 i2){}
c(i -> (i+1).toString())
c(i -> i.toString())

that is because here the return type will give no additional 
information, so only the parameter type can work and i.toString() works 
for both, i+1 should in theory also work for both.

bye blackdrag

Mime
View raw message