2013-09-28 44 views
4

我正在使用一些舊的Java庫,它們使用Scala中未指定類型參數(例如Eclipse draw2d)的集合。Scala與Java庫一起工作,沒有指定集合的​​類型參數

假設你有一個Java類(即你不能修改)是這樣的:

// A.java 
package com.example.test; 
import java.util.ArrayList; 

public class A extends ArrayList {} // not ArrayList<Object>, just ArrayList 

如果你想在Java類A的工作​​,你可以這樣做:

// B.java 
import com.example.test.A; 

public class B { 
    public static void main(String[] args) { 
    A a = new A(); 
    a.add(1); 
    } 
} 

javac B.java有一些警告成功:

Note: C.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

然而,斯卡拉相同的是IM可能:

// C.scala 
import com.example.test.A 

object C { 
    def main(args: Array[String]): Unit = { 
    val a = new A() 
    a.add(1) 
    } 
} 

scalac C.scala發出錯誤:

C.scala:6: error: type mismatch; 
found : Int(1) 
required: E 
    a.add(1) 
     ^

我如何在Scala中使用這個類?

回答

1

那麼你可以做的是:

val a = new A 
val ls = a.asInstanceOf[java.util.List[Any]] 
ls.add(1) 

但同樣,你將無法使用其他方法從A。我仍然不確定您將如何訪問A方法。參考(在變更日誌說):

A raw type in Java such as ArrayList is translated to ArrayList[_], which is a shorthand for ArrayList[T] forSome { type T }

所以Scala編譯器始終將其作爲A extends ArrayList[E] forSome {type E}和我的類型如何,可以躲過不確定(在編譯時)。

1

我找到了一個解決方案:

// C.scala 
import com.example.test.A 
import java.util.ArrayList 

object C { 
    def main(args: Array[String]): Unit = { 
    val a = new A() 
    a.asInstanceOf[ArrayList[Any]].add(1) // a.add(1) 
    println(a.size()) 
    } 
} 

此代碼解決了這個問題!

但我仍然想知道如何在Scala中轉換ArrayList[Nothing] -> ArrayList[Any],而Array是不變的。另外,Scala也接受ArrayList[Any] -> ArrayList[Nothing]轉換!

相關問題