or que as interfaces devem ser declaradas em Jav

s vezes, temos várias classes que têm alguns métodos com a mesma assinatura, mas que não correspondem a uma interface Java declarada. Por exemplo, ambosJTextField eJButton (entre vários outros emjavax.swing.*) tem um método

public void addActionListener(ActionListener l)

Agora, suponha que eu queira fazer algo com objetos que tenham esse método; então, eu gostaria de ter uma interface (ou talvez eu mesma a definir), por exemplo,

  public interface CanAddActionListener {
      public void addActionListener(ActionListener l);
  }

para que eu pudesse escrever:

  public void myMethod(CanAddActionListener aaa, ActionListener li) {
         aaa.addActionListener(li);
         ....

Mas, infelizmente, não posso:

     JButton button;
     ActionListener li;
     ...
     this.myMethod((CanAddActionListener)button,li);

Este elenco seria ilegal. O compilador sabe aqueleJButton não a CanAddActionListener, porque a classe não declarou implementar essa interface ... como ele "realmente" o implementa.

Às vezes, isso é um inconveniente - e o próprio Java modificou várias classes principais para implementar uma nova interface feita de métodos antigos String implements CharSequence, por exemplo)

Minha pergunta é: por que isso é assim? Entendo a utilidade de declarar que uma classe implementa uma interface. De qualquer forma, olhando para o meu exemplo, por que o compilador não pode deduzir que a classeJButton "satisfaz" a declaração da interface (olhando dentro dela) e aceita o elenco? É uma questão de eficiência do compilador ou há problemas mais fundamentais?

Meu resumo das respostas: Este é um caso em que o Java poderia ter permitido uma "digitação estrutural" (uma espécie de digitação de pato - mas verificada no momento da compilação). Isso não aconteceu. Além de algumas (não claras para mim) dificuldades de desempenho e implementação, há um conceito muito mais fundamental aqui: em Java, a declaração de uma interface (e, em geral, de tudo) não deve ser meramenteestrutura (para ter métodos com essas assinaturas) mas semantical: os métodos devem implementar algum comportamento / intenção específica. Então, uma classe que estruturalmente satisfaz alguma interface (ou seja, possui os métodos com as assinaturas necessárias) não necessariamente a satisfaz semanticamente (um exemplo extremo: lembre-se das "interfaces de marcador", que nem sequer têm métodos!). Portanto, o Java pode afirmar que uma classe implementa uma interface porque (e somente porque) isso foi explicitamente declarado. Outras línguas (Go, Scala) têm outras filosofia