满足是发明创造的窒息物——佚名
kt中的val让我用的爱不释手,不用重复定义一个又一个类型,编译器会自动推导
今天遇到一个情况,我们知道把java代码粘贴到kt文件里,idea会自动转换java为kt
但反过来将kt代码粘贴到java文件里则不会,原来的val,现在还是val
这时候可以使用lombok的val:https://projectlombok.org/features/val

例如下面的代码会被编译为合适的类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import java.util.ArrayList; import java.util.HashMap; import lombok.val;
public class ValExample { public String example() { val example = new ArrayList<String>(); example.add("Hello, World!"); val foo = example.get(0); return foo.toLowerCase(); } public void example2() { val map = new HashMap<Integer, String>(); map.put(0, "zero"); map.put(5, "five"); for (val entry : map.entrySet()) { System.out.printf("%d: %s\n", entry.getKey(), entry.getValue()); } } }
|
会被编译成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import java.util.ArrayList; import java.util.HashMap; import java.util.Map;
public class ValExample { public String example() { final ArrayList<String> example = new ArrayList<String>(); example.add("Hello, World!"); final String foo = example.get(0); return foo.toLowerCase(); } public void example2() { final HashMap<Integer, String> map = new HashMap<Integer, String>(); map.put(0, "zero"); map.put(5, "five"); for (final Map.Entry<Integer, String> entry : map.entrySet()) { System.out.printf("%d: %s\n", entry.getKey(), entry.getValue()); } } }
|
要注意一个细节,对于复合类型,推断的通常是父类,而不是接口,例如
bool ? new HashSet() : new ArrayList()会被推导为AbstractCollection而不是Serializable