(Dis-) vantagens da tipagem estrutural

15

Acabei de assistir esta palestra de Daniel Spiewak , onde ele fala sobre as vantagens da tipagem estrutural em comparação com a classificação nominal do Scala e ans . Um exemplo para essa diferença seria o seguinte código Java

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

que obviamente não seria compilado porque a compatibilidade de tipo entre Foo e Bar é determinada pelo nome.

Um sistema de tipo estrutural, por outro lado, poderia declarar ambos os tipos iguais ou compatíveis e, portanto, entre outras coisas, permitir a tipagem de pato marcada.

Agora, eu acho que entendo a maioria das vantagens de um sistema de tipo estrutural, mas gostaria de saber se isso não invalidaria a segurança de tipos de exemplos como os seguintes

class Foo {
  class Bar { /* ... */ }
  def takeBar(b: Bar) = { /* ... */ }
  def getBar: Bar = new Bar
}

val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile

O meu entendimento é correto que, em um sistema de tipo estrutural, a última linha também seria compilada? Em caso afirmativo, isso não seria uma desvantagem no que diz respeito à segurança de tipos?

    
por Debilski 07.11.2011 / 15:20
fonte

2 respostas

12

Na verdade, os tipos dependentes de caminho são ortogonais à tipagem estrutural vs nominal. Não está muito claro o que uma classe interna significa no contexto de uma linguagem simples e estruturalmente tipada. É, no entanto, muito possível definir isso. Se você fosse definir classes internas em um contexto estruturalmente tipado, você precisaria garantir que casos como o que você listou seriam rejeitados (precisamente pelas mesmas razões que o Scala os rejeita).

Você rejeitaria tais casos fazendo a mesma coisa que o Scala: modelar o tipo dependente de caminho como um tipo existencial. O mesmo procedimento de empacotamento / descompactação em torno do acesso a objetos seria válido, e os resultados pareceriam quase idênticos ao que o Scala faz. Os resultados podem parecer como uma igualdade de tipo nominal, mas ainda assim seria um sistema de tipo estrutural, já que a questão da compatibilidade de tipos ainda será decidida na interface em vez do nome.

A tipagem estrutural tem muitas implicações, mas (talvez surpreendentemente) a maioria dos mesmos conceitos que todos conhecemos e amamos a partir de sistemas de tipos nominais é transferida para a estrutura. A tipagem estrutural nada mais é do que uma maneira diferente de definir a compatibilidade de tipos.

    
por 07.11.2011 / 16:33
fonte
0

A tipagem estrutural facilita escrever o código da biblioteca genérica. A principal razão pela qual o ecossistema Java é tão inchado é porque é difícil escrever bibliotecas pequenas com facilidade. Se o Java fosse estruturalmente digitado, acho que seria uma história diferente e uma situação muito melhor.

A única desvantagem que posso pensar em tipagem estrutural é o potencial de compilação mais lenta. Não tenho certeza se as linguagens estruturais geralmente compilam mais lentamente do que as nominativas ou não, mas, por exemplo, Golang é estruturalmente digitado e muito rápido na compilação.

    
por 21.12.2018 / 09:12
fonte