1

私が作成したニューラル ネットワーク システムを視覚化できるように、JUNG2 ライブラリを使用していました。

最初に、JUNG2 のコード サンプルに従い、次の Java コードを使用しています。

DirectedSparseMultigraph<Integer, Integer> graph = new DirectedSparseMultigraph<Integer, Integer>();        
DelegateForest<Integer, Integer> delf = new DelegateForest<Integer, Integer>();
Factory<Tree<Integer, Integer>> delt = DelegateTree.<Integer, Integer>getFactory(); 
Transformer<Integer, Double> trans = new Transformer<Integer, Double>() {
    @Override
    public Double transform(Integer arg0) {
        return 1.0;
    }
};      
MinimumSpanningForest2<Integer, Integer> prim = new MinimumSpanningForest2<Integer, Integer>(graph, delf, delt, trans);

そして今、Scala の同等のコード:

var graph = new DirectedSparseMultigraph[Int, Int]
var delf = new DelegateForest[Int, Int]()
var delt = DelegateTree.getFactory[Int, Int]()
var trans = new Transformer[Int, Double] {
  def transform(input:Int):Double = {
    return 1.0
  }
}  
var prim:MinimumSpanningForest2[Int, Int] = new MinimumSpanningForest2(graph, delf, delt, trans)

Scala の例では、MinimumSpanningForest2 のインスタンス化により、Eclipse で次のような長いエラーが発生します。

overloaded method constructor MinimumSpanningForest2 with alternatives: 
 (edu.uci.ics.jung.graph.Graph[V,E],edu.uci.ics.jung.graph.Forest[V,E],org.apache.commons.collections15.Factory[_ <: 
 edu.uci.ics.jung.graph.Graph[V,E]],org.apache.commons.collections15.Transformer[E,java.lang.Double])edu.uci.ics.jung.algorithms.shortestpath
 .MinimumSpanningForest2[V,E] <and> 
 (edu.uci.ics.jung.graph.Graph[V,E],org.apache.commons.collections15.Factory[edu.uci.ics.jung.graph.Forest[V,E]],org.apache.commons.collecti
 ons15.Factory[_ <: 
 edu.uci.ics.jung.graph.Graph[V,E]],org.apache.commons.collections15.Transformer[E,java.lang.Double])edu.uci.ics.jung.algorithms.shortestpath
 .MinimumSpanningForest2[V,E] cannot be applied to (edu.uci.ics.jung.graph.DirectedSparseMultigraph[Int,Int], 
 edu.uci.ics.jung.graph.DelegateForest[Int,Int], org.apache.commons.collections15.Factory[edu.uci.ics.jung.graph.Tree[Int,Int]], java.lang.Object 
 with org.apache.commons.collections15.Transformer[Int,scala.Double])

私は何年も探していましたが、問題が見つかりません。Collections と JUNG2 の API ドキュメントを見ると、ジェネリックが正しいと確信しています。JAVA の例は問題なく動作しています。

4

1 に答える 1

7

うーん...信じられない。2時間の試行錯誤の後に質問を投稿したので、自分で答えを見つけました。これは、いわゆるドアノブ効果なのだろう……。

Doubleを .scala ファイルに入力すると、これはscala.lang.Double (もちろん) になりますが、上記の方法ではjava.lang.Doubleが必要です。したがって、これを次のように変更することで解決されます。

var transformer = new Transformer[Int, java.lang.Double] {   
  def transform(input:Int):java.lang.Double = {
    return 1.0
  }   
}

Java と Scala は互換性がありますが、Java と Scala の名前が同じクラスには十分注意する必要があります。Java の予備知識なしで Scala をプログラミングする場合、この問題を解決するのはおそらく非常に難しいでしょう。

于 2012-08-02T12:53:41.260 に答える