title: Why is "final" not allowed in Java 8 interface methods?
body: <p>One of the most useful features of Java 8 are the new <code>default</code> methods on interfaces. There are essentially two reasons (there may be others) why they have been introduced:</p>
  <ul>
  <li>Providing actual default implementations. Example: <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--" rel="nofollow noreferrer"><code>Iterator.remove()</code></a></li>
  <li>Allowing for JDK API evolution. Example: <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-" rel="nofollow noreferrer"><code>Iterable.forEach()</code></a></li>
  </ul>
  <p>From an API designer's perspective, I would have liked to be able to use other modifiers on interface methods, e.g. <code>final</code>. This would be useful when adding convenience methods, preventing &quot;accidental&quot; overrides in implementing classes:</p>
  <pre><code>interface Sender {
  
      // Convenience method to send an empty message
      default final void send() {
          send(null);
      }
  
      // Implementations should only implement this method
      void send(String message);
  }
  </code></pre>
  <p>The above is already common practice if <code>Sender</code> were a class:</p>
  <pre><code>abstract class Sender {
  
      // Convenience method to send an empty message
      final void send() {
          send(null);
      }
  
      // Implementations should only implement this method
      abstract void send(String message);
  }
  </code></pre>
  <p>Now, <code>default</code> and <code>final</code> are obviously contradicting keywords, but the default keyword itself <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2012-August/005393.html" rel="nofollow noreferrer">would not have been strictly required</a>, so I'm assuming that this contradiction is deliberate, to reflect the subtle differences between <em>&quot;class methods with body&quot;</em> (just methods) and <em>&quot;interface methods with body&quot;</em> (default methods), i.e. differences which I have not yet understood.</p>
  <p>At some point of time, support for modifiers like <code>static</code> and <code>final</code> on interface methods was not yet fully explored, <a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2011-December/004430.html" rel="nofollow noreferrer">citing Brian Goetz</a>:</p>
  <blockquote>
  <p>The other part is how far we're going to go to support class-building
  tools in interfaces, such as final methods, private methods, protected
  methods, static methods, etc.  The answer is: we don't know yet</p>
  </blockquote>
  <p>Since that time in late 2011, obviously, support for <code>static</code> methods in interfaces was added. Clearly, this added a lot of value to the JDK libraries themselves, such as with <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-" rel="nofollow noreferrer"><code>Comparator.comparing()</code></a>.</p>
  <h3>Question:</h3>
  <p>What is the reason <code>final</code> (and also <code>static final</code>) never made it to Java 8 interfaces?</p>