title: Receiving error[E0276]: impl has stricter requirements than trait with generics
body: <p>I'm trying to define a trait to compare two given parameters and return a <code>Result</code> based on the implementation. It has two generics but they can be anything when we implement it:</p>
  
  <pre><code>pub trait Assert&lt;L: Any + Debug&gt; {
      fn compare&lt;R: Any + Debug&gt;(self, target: R) -&gt; AssertResult;
  }
  </code></pre>
  
  <p>Now, when I want to implement equal, I will do:</p>
  
  <pre><code>pub struct Equal&lt;L&gt; {
      expected: L,
  }
  
  impl&lt;L&gt; Equal&lt;L&gt; {
      pub fn new(expected: L) -&gt; Equal&lt;L&gt; {
          Equal { expected: expected }
      }
  }
  
  impl&lt;L: 'static + fmt::Debug&gt; Assert&lt;L&gt; for Equal&lt;L&gt; {
      fn compare&lt;R: PartialEq&lt;L&gt; + fmt::Debug&gt;(self, target: R) -&gt; AssertResult {
          if target == self.expected {
              Ok(())
          } else {
              Err(format!(
                  "Expected {:?}, received {:?}",
                  self.expected,
                  target
              ))
          }
      }
  }
  </code></pre>
  
  <p>Link to <a href="https://play.rust-lang.org/?gist=353a5d38a729b6ed3618c3e8833101ce&amp;version=stable" rel="nofollow noreferrer">playground</a>.</p>
  
  <p>I want to be able to accept anything as <code>L</code> and <code>R</code> but restrict them in the implementation. I'm not sure if this is the correct approach though.</p>