Pergunta

Aqui está um exemplo usando a herança de múltiplas interface em Java e há um problema.

Observe que eu sei plenamente por que há um problema e esse não é o objetivo da minha pergunta. A questão é sobre como você nomeia essa ambiguidade de herança de múltiplas interface específica, se houver um nome para isso.

Por exemplo, em C ++, a ambiguidade que surge quando você usa a herança de múltiplas implementação e não pode determinar qual método substituído a ser chamado é chamado de "Problema de Diamante":

http://en.wikipedia.org/wiki/diamond_problem

Agora, mais uma vez, sei que esse não é o mesmo problema aqui: esse não é o ponto. O ponto é que um nome foi cunhado nesse caso anterior.

E eu gostaria de saber se existe um nome para o problema que estou prestes a descrever.

Aqui está um exemplo de outro tipo de herança múltipla, onde uma interface herda de duas outras interfaces que possuem um tipo de retorno de método incompatível:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(Observe a herança de múltiplas interface no trabalho usando a palavra -chave 'estende -se')

Você não pode fazer isso, porque:

Os tipos A e B são incompatíveis; ambos definem C (), mas com tipo de retorno não relacionado

Um nome foi cunhado para descrever essa situação?

Foi útil?

Solução

Não tenho certeza se há um nome específico para ele, ou pelo menos não parece ser muito comumente usado. É "apenas" um problema do mapeamento implícito dos métodos de interface para os métodos de classe; Se você pudesse ter sobrecarga que diferem apenas nos tipos de retorno, também não haveria problema. Portanto, tudo se resume a um problema de mapeamento de métodos de assinatura/sobrecarga/método implícito.

No livro on -line "Pensando em Java", também não há um nome para ele.http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/tij310_001.htm

Apenas uma nota lateral, C# permite implementações explícitas de interface, que aborda esse problema.

Outras dicas

JLS §6.4.4, os membros de um tipo de interface chama esses membros da SuperInterface duplicados ambíguo, e requer um erro de tempo de compilação. Eu esperava algo colorido, como o Efeito Beaujolais, Heisenbug, et al. Pode ser Duas são uma coragem?

Também não conheço nenhum nome específico para esse problema. Sempre que ele era descrito em uma frase contendo as palavras Retorno tipo incompatibilidade em algum ponto. Você também pode chamá -lo de Mapear/definir incompatibilty Como este é um dos exemplos mais proeminentes e irritantes nas bibliotecas de classe Java. Isso torna impossível ter o mesmo mapa de implementação de classe, bem como definido ou coleção apenas porque o mapa define um Remover (objeto) Método com um tipo de retorno diferente da coleção.

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

Eu hesitaria em chamar isso de uma questão de herança múltipla, porque as interfaces apenas descrevem bem, interface-um conjunto de métodos que uma classe de implementação deve definir-rather do que qualquer implementação. Estender uma interface com outras interfaces não significa realmente que a subinterface herda da super -interface, mas que a subinterface é, em essência, uma concatenação dos métodos definidos nos dois.

Se uma terceira interface for usada para estender a subinterface e fornecer uma declaração de método conflitante, é essencialmente o mesmo que se você tivesse acabado de fornecer os mesmos dois métodos conflitantes na mesma interface.

Não me lembro se já vi algum nome para isso. Dentro Especificação da linguagem Java Também não há nome para isso.

O problema que você descreve existe no .NET e do Java, mas possui uma solução simples lá: a estrutura .NET permite que uma classe implemente um membro da interface usando um membro da classe com um nome diferente. Assim, embora os métodos de classe que implementam dois membros da interface que diferem apenas no tipo de retorno sejam necessários para ter nomes diferentes, que não impedem sua capacidade de implementar membros da interface com o mesmo nome.

Se uma interface herdar duas interfaces com membros conflitantes, uma classe que implementa a interface composta pode implementar os membros, como se tivesse herdado diretamente as interfaces conflitantes. Os consumidores da interface combinada geralmente não serão capazes de usar os membros de qualquer interface de componentes sem converter a referência a um dos outros tipos de interface, mas o elenco em questão será considerado uma upcast e não uma abatida.

O esquema implementado no .NET funciona bem lá. Infelizmente, não há como fazer algo semelhante em Java. Não sei se Java irá gritar se uma interface herdar outras interfaces com membros conflitantes, mas se ela se abaixa ou não naquele momento, não haveria maneira de produzir uma classe que poderia implementá -la.

Não acho que um nome tenha sido definido porque as interfaces no Java não podem ter a implementação do método, o problema é, portanto, evitado, pois sempre existe apenas uma implementação para um método específico e, portanto, nenhuma ambiguidade surgirá.

Eu perdi o ponto ou você está falando sobre a variável 'C'?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top