1、概念
上述 Lambda 表达式中的参数类型都是由编译器推断得出的。
Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。
Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。
![](https://img.haomeiwen.com/i13909371/8ad476fae935ea86.png)
类型推断,因为它能猜出来,我们就没有必要写了,你写了,反而显得它很傻,它想告诉我们,它很聪明,编译器现在都很强悍
2、案例一
interface I3<T, R> {
R cale(T t1, T t2);
}
public class TestLambda3 {
//有返回有参
@Test
public void test4() {
I3<Double, Integer> i = new I3<Double, Integer>() {
@Override
public Integer cale(Double t1, Double t2) {
return (int) (t1 + t2);
}
};
System.out.println(i.cale(1.5, 2.6));
System.out.println("------------------------");
I3<Double, Integer> i2 = (t1, t2) -> (int) (t1 + t2);
System.out.println(i2.cale(2.2, 3.3));
}
}
I3<Double, Integer> i2 = (Double t1, Double t2) -> (int) (t1 + t2);
3、案例二
package com.yinggu.demo2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
* @author 黑猴子的家
* http://www.121ugrow.com/
* 此类用于演示类型推断
* 类型推断: 编译器根据上下文推断出对应的类型,开发人员不用手动的写上类型
public class TestTypeAna {
@Test
public void test1() {
@SuppressWarnings("unused")
List<String> list = new ArrayList<>();
}
}
List<String> list = new ArrayList<String>();
4、案例三
@Test
public void test2() {
print(new HashMap<>());
}
public void print(Map<String, Integer> map) {
}
@Test
public void test2() {
print(new HashMap<String,Integer>());
}
网友评论