2010-11-14 7 views
1

Je reçois un échec de compilation en utilisant le plugin Maven Scala que je ne reçois pas en utilisant l'IDE Eclipse Scala. Tout d'abord le code:Différence dans l'inférence de type Scala, Eclipse vs. Maven

package com.example 

trait SomeTrait[OUTPUT, INPUT] { 
    def apply(request: INPUT, f: OUTPUT => Unit); 
} 

class SomeClass extends SomeTrait[String,String] { 
    def apply(request, f) { 
     f.apply(request.toUpperCase()) 
    } 
} 

object App extends Application { 
    override def main(args: Array[String]) { 
     new SomeClass()("test", (value) => { println(value)}) 
    } 
} 

Eclipse Scala IDE est bien, mais Maven me donne cette erreur:

[ERROR] .../src/main/scala/com/example/App.scala:8: 
    error: ':' expected but ',' found. 
[INFO]  def apply(request, f) { 
[INFO]     ^
[ERROR] .../src/main/scala/com/example/App.scala:11: 
    error: identifier expected but '}' found. 
[INFO] } 

Si je précise les types, comme dans:

class SomeClass extends SomeTrait[String,String] { 
    def apply(request: String, f: String => Unit) { 
     f.apply(request.toUpperCase()) 
    } 
} 

Il rassemble à la fois .

Versions etc .:

Scala version: 2.8.1 
Scala IDE for Eclipse: 1.0.0.201011130651 
Maven: 3.0 
Maven Scala Plugin: 2.15.0 
Java: 1.6.0_17 

Répondre

4

Eclipse ne tourne pas rond ... vous devriez voir la même erreur de compilation là comme vous le faites dans le cas de ligne de commande. Ce qui est déconcertant, c'est que le compilateur Scala intégré à Eclipse (qui n'est que scalac 2.8.1.final fonctionnant en mode de compilation incrémentielle) parvient à compiler avec succès la source que vous avez fournie à l'origine et infère les types d'arguments que vous voulez. ... les classfiles sont générés, et dans la sortie binaire SomeClass.apply a la signature que vous attendez.

Cela ne devrait tout simplement pas arriver.

MISE À JOUR:

Comme Paul a noté l'IDE se comporte comme si -Yinfer argument types ont été activés. Il se comporte également comme si les types de méthode -Ydependent étaient activés. Ce qui suggère qu'il y a quelque chose d'anormal avec la nouvelle logique derrière l'option -Xexperimental qui se manifeste lorsque les instances de paramètres du compilateur sont créées de la même façon que l'EDI le fait.

+0

Scala: rendre l'impossible possible depuis 2003. Merci pour la réponse. Je pense que j'aime -Yinfer-argument-types et -Ydependent-method-types. –

2

Vous utilisez -Yinfer-argument-types où que ce soit.

+0

Je n'ai pas vu ce drapeau avant ... nouveau dans 2.8.1? De toute façon, l'EDI semble obtenir une instance de paramètres avec ce drapeau activé par défaut ... qui ne peut certainement pas être destiné? –

+0

C'est un mais dans ScalaSettings: nous mettons -Xexperimental à false, mais indépendamment de sa valeur -YdepMethodTypes et -Ymethodinfer sont mis à true. – venechka

+0

Je voulais dire que c'est un bug, désolé. – venechka