返回信息流```Java
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
```
这种情况下编译器推断出T是`Serializable`,但是如果是下面这种情况呢?
```Java
static <T> T pick(T a1, T a2) { return a2; }
pick("d", new ArrayList<String>());
```
单纯从arguments的类型进行推断,这个时候编译器推断出来的T是什么?`Object`?
这是一条镜像帖。来源:北邮人论坛 / java / #58957同步于 2018/4/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】类型推断
shinian
2018/4/26镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
返回类型是一个 a1, a2的共同点的集合类,这样说可能有点不好
泛型的类型推断是一个编译期的行为,pick的上下文还不足以推断它是什么,所以可以认为暂时它还是a1,a2的共同点的集合类,为啥说这个说法不太好,因为在类的定义中,很可能不存在由这个共同点集合组成的真实存在的类
举个栗子
```java
public abstract class Father{void talk(){};}
public interface WalkdogMan{void walkdog();}
public interface WorkMan{void work();}
public interface PlayGameMan{void playGame();}
public class ChinaFather extends Father implements WorkMan, PlayGameMan{
@Override
public void work() {
}
@Override
public void playGame() {
}
}
public class USFather extends Father implements WalkdogMan, WorkMan{
@Override
public void walkdog() {
}
@Override
public void work() {
}
}
public static <T> T pick(T a, T b){
return a;
}
public void test() {
ChinaFather chinaFather = new ChinaFather();
USFather usFather = new USFather();
pick(chinaFather, usFather).walkdog();// compile error
pick(chinaFather, usFather).talk();
pick(chinaFather, usFather).work();
pick(chinaFather, usFather).playGame();// compile error
}
```
可以看到,实际并不存在一个只会工作的工作狂爸爸,但pick()的结果被编译器认为是一个只会工作和说话的“工作狂爸爸”,因为上下文不足够。如果足够,例如加入了赋值或者方法调用,它可能被认为是一个会工作的人或者是一个爸爸。
水平有限,仅供参考
【 在 shinian 的大作中提到: 】
: [md]
: ```Java
: static <T> T pick(T a1, T a2) { return a2; }
: ...................