- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的 Scala 中使用了一个 Java 类,它生成 ambiguous reference to overloaded definition
.这是解释这个问题的代码。
IComponent.java
package javascalainterop;
import java.util.Map;
public interface IComponent {
public void callme(Map<String, Object> inputMap);
}
package javascalainterop;
import java.util.Map;
public class AComponent implements IComponent {
String message;
public AComponent(String message) {
this.message = message;
}
@Override
public void callme(Map inputMap) {
System.out.println("Called AComponent.callme with " + message);
}
}
package javascalainterop
import java.util.{Map => JMap}
class BComponent(inputMessage: String) extends AComponent(inputMessage) {
override def callme(inputMap: JMap[_, _]) {
println(s"Called BComponent.callme with $inputMessage")
}
}
package javascalainterop
import java.util.{HashMap => JHashMap}
object ComponentUser extends App {
val bComponent = new BComponent("testmessage")
val javaMap = new JHashMap[String, AnyRef]
bComponent.callme(javaMap)
}
BComponent.scala
和
ComponentUser.scala
编译失败并显示以下消息。
javascalainterop/ComponentUser.scala:8: error: ambiguous reference to overloaded definition,
both method callme in class BComponent of type (inputMap: java.util.Map[_, _])Unit
and method callme in trait IComponent of type (x$1: java.util.Map[String,Object])Unit
match argument types (java.util.HashMap[String,AnyRef])
bComponent.callme(javaMap)
^
one error found
super[AComponent].callme
也不能解决问题。如何解决这种情况以便代码编译和
AComponent.callme
在运行时调用?
最佳答案
已编辑
我已经对这个答案进行了重大编辑,以解决早期的混淆并且更正确。
我认为您正在使用的原始库已损坏,并且没有做它看起来正在做的事情。IComponent
声明一个方法 void callme(java.util.Map<String, Object> inputMap)
(相当于 Scala 中的 callme(inputMap: java.util.Map[String, AnyRef]: Unit
),而 AComponent
声明 void callme(java.util.Map inputMap)
(callme(inputMap: java.util.Map[_, _]): Unit
在 Scala 中)。
也就是说,IComponent.callme
接受 Java Map
其键是 String
其值为 AnyRef
, 而 AComponent.callme
接受 Java Map
其键是任何类型,其值是任何类型。
默认情况下,Java 编译器会毫无怨言地接受这一点。但是,如果使用 -Xlint:all
编译选项,Java 编译器将发出警告:
javascalainterop/AComponent.java:12:1: found raw type: java.util.Map
missing type arguments for generic class java.util.Map<K,V>
public void callme(Map inputMap) {
Map
更大的问题。的类型参数。
AComponent.callme
的编译时间签名方法与
IComponent.callme
的方法不同方法,现在看来
AComponent
提供两种不同的
callme
方法(一种采用
Map<String, Object>
参数,另一种采用
Map
参数)。然而,同时,类型删除(在运行时删除泛型类型信息)意味着这两种方法在运行时(以及使用 Java 反射时)看起来也相同。所以,
AComponent.callme
覆盖
IComponent.callme
(从而履行
IComponent
接口(interface)的契约(Contract)),同时还对
Acomponent.callme
进行任何后续调用与
Map<String, Object>
实例模棱两可。
callme
BComponent
中的定义并更改
ComponentUser.scala
的内容文件如下:
package javascalainterop
import java.util.{HashMap => JHashMap}
object ComponentUser extends App {
//val bComponent = new BComponent("testmessage")
val javaMap = new JHashMap[String, AnyRef]
//bComponent.callme(javaMap)
// Test what happens when calling callme through IComponent reference.
val aComponent = new AComponent("AComponent")
val iComponent: IComponent = aComponent
iComponent.callme(javaMap)
}
Called AComponent.callme with AComponent
AComponent
例如,将其转换为
IComponent
引用,当我们调用
callme
,它是明确的(
IComponent
只有一个名为
callme
的方法)并执行
AComponent
提供的覆盖版本.
callme
会发生什么?原创
aComponent
?
package javascalainterop
import java.util.{HashMap => JHashMap}
object ComponentUser extends App {
//val bComponent = new BComponent("testmessage")
val javaMap = new JHashMap[String, AnyRef]
//bComponent.callme(javaMap)
// Test what happens when calling callme through each reference.
val aComponent = new AComponent("AComponent")
val iComponent: IComponent = aComponent
iComponent.callme(javaMap)
aComponent.callme(javaMap)
}
javascalainterop/ComponentUser.scala:14:14: ambiguous reference to overloaded definition,
both method callme in class AComponent of type (x$1: java.util.Map[_, _])Unit
and method callme in trait IComponent of type (x$1: java.util.Map[String,Object])Unit
match argument types (java.util.HashMap[String,AnyRef])
aComponent.callme(javaMap)
^
BComponent
然而。
AComponent.callme
应该接受 Map<String, Object>
参数——用 Java 术语来说——不仅仅是 Map
参数),或 AComponent
版本正常工作,或IComponent
的复杂性。和
AComponent
类,但您可能会发现更改
BComponent
很有用实现
IComponent
, 而使用
AComponent
实例在其实现。如果
BComponent
不必源自
AComponent
(在
BComponent.scala
中):
package javascalainterop
import java.util.{Map => JMap}
class BComponent(inputMessage: String) extends IComponent {
// Create an AComponent instance and access it as an IComponent.
private final val aComponent: IComponent = new AComponent(inputMessage)
// Implement overridden callme in terms of AComponent instance.
override def callme(inputMap: JMap[String, AnyRef]): Unit = {
println(s"Called BComponent.callme with $inputMessage")
aComponent.callme(inputMap)
}
}
关于java - 在 Scala 中使用 Java 类时出现 "ambiguous reference to overloaded definition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775674/
我刚用 Latex 写完微积分的总结。 现在的主要问题是文件中包含许多我现在并不真正需要的东西。 .tex 文件包含许多我需要用心学习的定义和定理。 定义在 tex 文件中有自己的定义,因此文件中的任
所以我有一个菜单项列表,我想弄清楚我是否应该使用具有类属性的跨度或每个元素的特征的定义列表。以下是我正在考虑的两个选项: 选项 1) // HAML Markup %article.menu-item
考虑下面的代码,它试图实现 class Bar 的部分特化。 .在第一种情况下,foo成员函数是内联定义的,在第二种情况下是外联的。行外定义产生了一个我无法弄清楚的编译错误:error: out-of
我正在使用 Visual Studio Code 开发一个 typescript 项目,包括多个结构如下的 npm 包: 源代码:/src/index.ts 编译后的代码:/dist/... 当我右键
我正在编写一个神经网络类,遇到了两个我不理解的概念。谁能告诉我bias 和momentum 是什么以及做什么 最佳答案 偏差是给予神经元的恒定输入。例如在普通的前馈网络中,您可能有 2 个输入单元、2
假设我在功能文件中有一个场景,如下所示 Given I log in as "super" user When I click on login Then Home page is displayed
关闭。这个问题是opinion-based 。目前不接受答案。 已关闭去年。 已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我读了很多这个词
就像几乎任何一个已经编程了一段时间的人一样,我熟悉“生产代码”这个术语,并且对其含义有一个模糊的认识。然而,有人可以提供一个半严格的定义吗,因为维基百科和谷歌似乎不能?在生产中似乎存在很多灰色地带,例
以下代码是我认为符合伪代码条件的示例,因为它不以任何语言执行,但逻辑是正确的。 string checkRubric(gpa, major) bool brake = false nu
从宠物商店示例中获取以下#definition。给定#definition部分,可以生成JSON结构 例如 给定一个较大的复杂JSON文件,是否可以做一些相反的事情? 给定下面的JSON结构,我可以获
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
Joel Spolsky 在 SO 播客中提到了“浮出水面”。 这是什么意思?它是类似于“暴露”的东西吗,比如“暴露接口(interface)”? 最佳答案 这里引用自 podcast 51 的文字记
我不断遇到这个词的用法,但我从来不理解它的用法或所传达的含义。 像...这样的短语 "add semantics for those who read" "HTML5 semantics" "sema
我正在学习 lisp 语言(做 lisp 例程),在一般情况下我知道什么是例程,但在技术上下文中我可以谈论它,因为我现在开始学习例程。那么,例行公事的真正定义是什么?(我已经用谷歌搜索过这个,但没有找
在 definition of the haskell prelude我们看到 ... 是为无法在 Haskell 中实现的表达式保留的。例如,现在 IO monad 无法在 haskell 中实现。
问题: 原来有单个文件tcpclient.c,运行gcc -o tcpclient tcpclient.c可以顺利完成编译,并能与下载到目标板中的tcpserver成功通讯; 现在把tcpclien
我使用 ergoemacs-mode、clojuremode 和自动完成 自动完成效果很好。我应该按什么才能进入函数的定义?我习惯了 Cursive,但我想使用免费的 Emacs,我需要去定义功能。
我对 nearly.js 很陌生,我想知道与规则相比,分词器/词法分析器做了什么,根据网站: By default, nearley splits the input into a stream of
我正在使用 Gforth ,我想在定义中创建一个词。在 Gforth 的 cmd 行中,我可以输入: create foo ok 或者更具体地说,我定义了一个数组函数,它期望堆栈上的大小并创建一个带有
我是一名优秀的程序员,十分优秀!