Java Generic Type转换为Scala不接受超类本身

时间:2018-05-22 01:39:21

标签: java scala types existential-type bounded-wildcard

我正在编写一个框架。接口是用Java代码编写和编译的。客户端使用Scala和那些接口。这是界面的一个例子。

    ....
    LatLng latLng = getLocationFromAddress(TheNameOfActivity.this, "london");
    if(latLng != null){
        MarkerOptions options = new MarkerOptions().position(latLng);
        if(googleMap != null){
            googleMap.addMarker(options);
        {
    }
} 

现在我的scala代码使用如下界面。

public interface Context {
   MyComponent<? extends File> getComponent();
}

Scala编译器在{2}的第2行抛出错误。错误是:类型不匹配,预期:MyComponent [File],actual:MyComponent [_&lt;:File]。

1 个答案:

答案 0 :(得分:1)

Java的通配符类型

const a = [{id:1, name:'a'},{id:2, name:'b'},
        {id:3, name:'c'},{id:4, name:'d'},{id:5, name:'e'}];

const b = ['a','d'];

const c = a.filter(function(item){
  return b.indexOf(item.name) !== -1
}).map(function(item){
  return item.id
});

console.log(c);

对应于存在类型

? extends File
Scala中的

尝试更改签名

_ <: File

def calculate(component: MyComponent[File]): Unit = ???

另请注意,如果def calculate(component: MyComponent[_ <: File]): Unit = ??? 是受您控制的Scala类,那么将不变类型参数更改为协变类型参数MyComponent也可能有效,因为每个+F将是MyComponent[F] forSome { type F <: File }的特例。