2014-07-31 1 views
5

При манипулировании объектами scala (в основном из пакета scala.collection) функции перегруженных оператором функций, по-видимому, доступны для использования в Java.Операторы scala как методы в java

т.е. в Скале

var s = Set(1, 2, 3) 
var t = s + 4 
var x = s | t 

так в Java, глядя на scala.collection.Set в затмение автозаполнения, я могу видеть прототипы

eclipse screenshot

Но я не могу использовать их правильно

import scala.collection.Set; 

Set<Integer> s = new Set<Integer>(); 
Set<Integer> t = s.$plus(4); /* compile error with javac, or runtime error with eclipse/* 

Как эти scala m этаты, предназначенные для использования внутри Java?

+3

Я думаю, это не проблема имен методов по себе: причина в иерархии коллекции, вероятно, Скала и контрвариантность: Javac не может считать 'scala.collection.Set ' как '' scala.collection.immutable.Set

+0

Я думаю, контравариантность в моем другом вопросе, хотя и присутствует, была красной селедкой. В этом случае я не использую 'scala.collection.immutable.Set <>' Я просто использую 'scala.collection.Set <>' – muttonUp

ответ

1

Казалось бы, вы не можете закодировать некоторые интерфейсы scala в Java!
Этот код компилируется и выполняется правильно в Sun и Eclipse.

Обратите внимание на использование HashSet на левой стороне уступке

import scala.collection.HashSet; 

public class TestCase1 { 

    public static void main(String[] args) { 
     HashSet<String> set2 = new HashSet<String>(); 

     HashSet<String> set4 = set2.$plus("test"); 

     System.out.println(set2.size()); 
     System.out.println(set4.size()); 


    } 
} 

Почему это так?

Я считаю, что это имеет какое-то отношение к способности Scalas наследовать множественные черты, которые java eclipse не понимает.

Например, HashSet расширяет AbstractSet, Set, GenericSetTemplate,SetLike, FlatHashTable, CustomParallelizable, Serializable, некоторые из которых являются интерфейсами, некоторые из которых являются AbstractClasses.

Метод .$plus() будет приходить с SetLike, не Set, что бы объяснить, почему вызов метода на Set Supertype бы вызвать эту ошибку.

Это говорит, что я до сих пор не могу ссылаться на HashSet, используя Supertype SetLike, поскольку это все еще не удается, и это насколько я могу идти.

Я думаю, что главная проблема здесь в том, что Elipse каким-то образом искажает супертип как имеющий эти методы, что неправильно.