作者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