在做一些基本的lambda练习时,一个看似相同的匿名内部类的输出给了我一个不同于lambda的输出.
interface Supplier<T> {
T get(T t);
}
Run Code Online (Sandbox Code Playgroud)
场景#1
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get(Integer t) {
return t;
}
};
Supplier<Integer> s2 = t -> t;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)
输出2和2.这里没什么新鲜的.
但是当我这样做时:
场景#2
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get(Integer t) {
return t++;
}
};
Supplier<Integer> s2 = t -> t++;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)
输出2和3
问题:两个输出不应该相同吗?我错过了什么吗?
为了完整起见: 场景#3
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer …Run Code Online (Sandbox Code Playgroud) 虽然Java 8的类型推断看起来有了很大的改进,但我遇到了一个可能的限制,我不确定是否有一些我缺少的解决方法.场景:
class Foo<T> {
<U> void apply(Function<T, Consumer<U>> bar) {}
}
class Bar {
void setBar(String bar){}
}
Foo<Bar> foo = new Foo<>();
Run Code Online (Sandbox Code Playgroud)
这有效:
foo.<String>apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)
这不是:
foo.apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)
有没有办法让类型推断在这种情况下工作?