2

我们需要将 x10 arraylist[string] 作为对象传递给 Java 方法。我们尝试的是这个。Java接口中的方法签名如下。

public void getX10ArrayList ( ArrayList <String > nameList):

我们在 X10 类中实现该方法,如下所示。

public def getX10ArrayList ( var names : ArrayList [String] ) {
    // do something
}

我们得到一个编译错误,说接口需要一个类型的对象,x10.util.ArrayList但我们正在发送一个类型为x10.util.ArrayList[x10.lang.String]` 的对象。

4

2 回答 2

0

您不需要将您的接口签名声明为 -

Public void getX10ArrayList(ArrayList[String] nameList):
于 2017-02-23T07:32:52.453 回答
0

不幸的是,当前的 X10 类型系统不允许 X10 类实现参数化的 Java 接口。尽管看起来正确的解决方案是按照@Darpan 的建议定义接口:

public void getX10ArrayList(ArrayList[String] nameList);

当Java接口进行类型检查时,类型参数从X10接口中删除,因此类型不同。从 X10 到 Java 类的翻译细节可以在论文Compiling X10 to Java (Takeuchi et al. 2011)中找到。

一种可能的解决方法是将泛型类包装在非参数化类型中。例如:

// MyArrayList.java
import java.util.ArrayList;
class MyArrayList {
    public ArrayList<String> list;
}

// X10ArrayListProvider.java
public interface X10ArrayListProvider {
    public void getX10ArrayList(MyArrayList nameList);
}

// ArrayListProvider.x10
import MyArrayList;
import X10ArrayListProvider;
public class ArrayListProvider implements X10ArrayListProvider {
    public def getX10ArrayList(names:MyArrayList):void {
        // ...
    }
}
于 2017-03-07T23:41:03.593 回答