接口上不存在的实现上的调用方法

时间:2019-07-19 13:05:37

标签: java

有一个我正在与之交互的库导出的接口。为了实现MCVE,我们假设它是一个名为Marker的空接口。

标记器具有名为MarkerImpl的该接口的实现,该接口还包含名为removeMarker的方法-但该方法不在接口上,并且MarkerImpl isn不会公开显示-我无法导入它以将marker投向它。

我想在我的removeMarker实例上调用Marker方法,所以我尝试这样做:

interface RemovableMarker extends Marker {
    void removeMarker();
}

然后这样称呼它:

RemovableMarker removable = (RemovableMarker) marker;
removable.removeMarker();

但是出现以下错误:

  

Marker无法转换为RemovableMarker

我怎么打marker.removeMarker

2 个答案:

答案 0 :(得分:1)

通过将其转换为具有removeMarker()方法的{strong>实际类型:MarkerImpl

Java的结构类型不像TypeScript。如果一个类没有实现接口,那么即使它具有带有相同签名的方法,也不会实现它。 MarkerImpl未实现您的接口RemovableMarker,因此MarkerImpl的实例不是RemovableMarker,并且不能转换为RemovableMarker

答案 1 :(得分:0)

我已经用getDeclaredMethod

解决了这个问题
Method removeMarker = marker.getClass().getDeclaredMethod("removeMarker");
removeMarker.setAccessible(true);
removeMarker.invoke(marker);