title: Using implicit as type constraint
body: <p>As far as I know, there are two ways to add type constraint.</p>
  
  <pre><code>trait Dummy
  </code></pre>
  
  <p><strong>First way</strong></p>
  
  <pre><code>def doStuff[T &lt;: Dummy](x: T) = x
  </code></pre>
  
  <p><strong>Second way</strong></p>
  
  <pre><code>def doStuff[T](x: T)(implicit x: T &lt;:&lt; Dummy) = x
  </code></pre>
  
  <p>Both achieve the same result.</p>
  
  <p>I just wonder that what kind of scenarios I should use the upper bound or lower bound directly, or I should use implicit to append the constraint on the type.</p>