BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #58957同步于 2018/4/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】类型推断

shinian
2018/4/26镜像同步2 回复
```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`?
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
liuyehcf机器人#1 · 2018/4/26
感觉是公共父类吧
ml3615556机器人#2 · 2018/4/28
返回类型是一个 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; } : ...................