<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 15, 2015, at 11:02 AM, Thorsten Seitz via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px; line-height: normal;">Shouldn’t we just narrow the type of protocols with associated types and/or Self types when the protocol is used as a type?</div><div class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px; line-height: normal;"><br class=""></div><div class="" style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(88, 110, 117);"><br class=""></div></div></blockquote>&lt;snip&gt;</div><div><br class=""><blockquote type="cite" class=""><div class=""><div class="" style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(88, 110, 117);"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="color: rgb(211, 54, 130);">foo</span><span class="" style="color: rgb(131, 148, 150);">.</span><span class="" style="color: rgb(211, 54, 130);">value</span><span class="" style="color: rgb(131, 148, 150);"><span class="Apple-converted-space">&nbsp;</span>=<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(211, 54, 130);">x</span><span class="" style="color: rgb(131, 148, 150);"><span class="Apple-converted-space">&nbsp;</span></span>// ERROR: calling setter not allowed</div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="color: rgb(211, 54, 130);">foo</span><span class="" style="color: rgb(131, 148, 150);">.</span><span class="" style="color: rgb(108, 113, 196);">bar</span><span class="" style="color: rgb(131, 148, 150);">(</span><span class="" style="color: rgb(211, 54, 130);">x</span><span class="" style="color: rgb(131, 148, 150);">)<span class="Apple-converted-space">&nbsp;</span></span>// ERROR: not allowed</div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="color: rgb(133, 153, 1);">let</span><span class="" style="color: rgb(131, 148, 150);"><span class="Apple-converted-space">&nbsp;</span>z:<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(181, 137, 1);">Bounds</span><span class="" style="color: rgb(131, 148, 150);"><span class="Apple-converted-space">&nbsp;</span>=<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="color: rgb(211, 54, 130);">foo</span><span class="" style="color: rgb(131, 148, 150);">.</span><span class="" style="color: rgb(108, 113, 196);">baz</span><span class="" style="color: rgb(131, 148, 150);">(</span><span class="" style="color: rgb(211, 54, 130);">x</span><span class="" style="color: rgb(131, 148, 150);">)<span class="Apple-converted-space">&nbsp;</span></span>// ERROR: not allowed</div></div></div></blockquote><br class=""></div><div><br class=""></div><div>The problem is that you are implicitly defining a fixed type protocol off of your “deferred type” protocol, but the designer of the protocol may have not understood the restrictions of use that will come from those using the implicit fixed-type protocol. &nbsp;By having this narrowed version of the protocol, you may be using the protocol “out of warranty”, e.g. in a way that the original designer never intended.</div><div><br class=""></div><div>I’ve spent significant time refactoring code after the fact which has had similar behavior by using wildcards. &nbsp;Java makes this worse by having unreified generics, which may result in the problem being deferred &nbsp;until someone actually pays attention that the type system is fundamentally inconsistent.</div><div><br class=""></div><div>Still, I feel anything that defers the fixed type protocol design from being considered as part of the API design of the protocol is penalizing the users of the library, not the creator. Without fixing the protocol, my only choice with the above code is to switch to using generic constraints, potentially “all the way up”</div><div><br class=""></div><div>-DW</div></body></html>