Pergunta

Um pouco mais específico do que pergunta Stack Overflow O que é um tipo existencial? , o que é a diferença entre o tipos existenciais do Scala e Java do wildcard , prefereably com algum exemplo ilustrativo?

Em tudo o que eu vi até agora, eles parecem ser bastante equivalente.

Algumas referências. Martin Odersky os menciona ; top hit do Google para a minha pergunta :

MO: O projeto curinga originais ... foi inspirado por tipos existenciais. Na verdade, o papel original tinha uma codificação em tipos existenciais. Mas então, quando o projeto final real saiu em Java, esta ligação se perdeu um pouco

Foi útil?

Solução

Esta é a resposta de Martin Odersky na lista Scala-users:

O Java originais curinga tipos (como descrito no documento ECOOP por Igarashi e Viroli) eram de fato apenas atalhos para existencial tipos. Disseram-me e eu li no jornal TOLO '05 sobre Wild FJ que a versão final do wildcards tem algumas diferenças sutis com tipos existenciais. Eu não sei exatamente em que sentido (a sua formalismo é muito distante tipos existenciais clássicas para ser capaz de identificar a diferença), mas talvez uma leitura cuidadosa do selvagem papel FJ iria lançar alguma luz sobre isso.

Assim, parece que Scala tipos existenciais e wildcards Java são tipo-de equivalente

Outras dicas

Eles são supostamente para ser equivalente, como seu principal objetivo é interagir com wildcards do Java.

Eles são muito semelhantes, mas tipo existencial de Scala é suposto ser mais poderoso. Por exemplo, tipo existencial Scala pode ser superior e inferior delimitada Considerando universal de Java só pode ser superior ligado.

Por exemplo, no Scala:

scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]

o foo pega uma lista de parâmetro que tem um limite inferior de Int.

Uma maneira resposta mais detalhada por Martin Odersky (o resto pode ser encontrada aqui ):

Scala precisa tipos existenciais por essencialmente três coisas. O primeiro é que precisamos fazer algum sentido de curingas do Java, e tipos existenciais é o sentido que fazemos deles. A segunda é que nós precisa fazer algum sentido de tipos de matérias de Java, porque eles também são ainda nas bibliotecas, os tipos ungenerified. Se você receber uma matéria-Java tipo, como java.util.List é uma lista onde você não sabe o tipo de elemento. Isso também pode ser representado no Scala por um existencial tipo. Finalmente, precisamos tipos existenciais como uma forma de explicar o que se passa na na VM com o elevado nível de Scala. Scala utiliza o modelo de apagamento dos genéricos, assim como o Java, por isso, não vemos os parâmetros de tipo mais quando os programas são executados. Temos que fazer apagamento porque precisamos para interoperar com Java. Mas então o que acontece quando fazemos reflexão ou quer expressar o que vai na na VM? Precisamos ser capazes de representam o que a JVM não usando os tipos que temos no Scala, e tipos existenciais vamos fazer isso. Eles permitem que você falar sobre os tipos de onde você não sabe certos aspectos desses tipos.

A notação List[_] (que, como outras respostas salientar é uma mais potente analógico para List[?] de Java) é um caso degenerado do mais geral noção de um tipo existencial em Scala.

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