title: Explanation of the get-put principle
body: <p>I have read O'Reilly book, in that I came to know this <strong><em>get-put principle</em></strong>.</p>
  
  <blockquote>
    <ul>
    <li>Use an <strong><code>extends</code></strong> wildcard when you only <strong>get</strong> values out of a structure. </li>
    <li>Use a <strong><code>super</code></strong> wildcard when you only <strong>put</strong> values into a structure.</li>
    <li>And don't use a wildcard when you both want to get and put from/to a structure.</li>
    </ul>
  </blockquote>
  
  <p><strong>Exceptions</strong> are:</p>
  
  <blockquote>
    <ul>
    <li><p>You cannot put anything into a type declared with an <strong><code>extends</code></strong> wildcard except for the value <strong><code>null</code></strong>, which belongs to every reference type.</p></li>
    <li><p>You cannot get anything out from a type declared with an <strong><code>super</code></strong> wildcard except for a value of type <strong><code>Object</code></strong>, which is a super type of every reference type.</p></li>
    </ul>
  </blockquote>
  
  <p>Can anyone help me to explore this rule at depth? If possible, please put them hierarchical manner.</p>