作者macbuntu (邀怪)
看板PLT
标题Re: [问题] 如何处理 conditional operator
时间Fri Mar 20 17:40:02 2009
※ 引述《godfat (godfat 真常)》之铭言:
: 我试了一下 javac, 单纯的 func(new X()) 和 func(new Y()) 也是 ambiguous.
: 这个意思不就是除了 void 以外,所有 exp 的 result type 都必须是集合?
: 不过似乎只需要针对有 overload 的 function 上的 argument 上做这样的
: 集合检查就好?
如果没有 a ? b : c 这种东西, 不用集合就可以检查了...
new X() 的型别就是唯一的 X, 所以呼叫 func(new X()) 只要一一比对
func(A), func(int)... 这些名称跟 parameter 个数符合的 methods,
用类似 Type.isAssignbleFrom(X) 的方法比对 formal paramter type,
很快在 linear time 就可以找得到一群 "compatible" methods,
然後再用另一个演算法看看 "most specific" method 是不是唯一,
如果唯一就 OK, 否则 ambiguous.
: 而 exp0 ? exp1 : exp2 的 result type 则会是 exp1 的 result type
: 与 exp2 的 result type 的交集。最後再跟 function argument 做交集,
: 结果超过一个以上就是 ambiguous. 其他状况可能不需要这麽麻烦?
用集合就变超麻烦的说, 假设有两个 parameter, 每个各有两种可能,
而且那两个型别互相没继承关系, 类似前一篇说的 A, N1, N2 之间:
func( { a,b }, { c,d } );
那不就变成要找 compatible methods 的阶段就需要测试:
func( a, c );
func( a, d );
func( b, c );
func( b, d );
这四种可能? 这复杂度是 exponentional 的耶, 就为了个区区 a ? b : c 囧...
如果真的要用集合来找, 应该会有什麽聪明的演算法吧?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.91.116