问题标签 [dynamic-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java中静态方法中这种奇怪的动态方法调度行为是什么
以下示例中的实用程序方法仅用于说明目的。
在下面的示例中,instance method
调用被分派到引用类型而不是运行时对象。
下面是我得到的输出
经过一番调查,我发现尝试 1 和 2 中的差异java.util.Date.after(Date)
被调用,staticFindNewer()
并且是由于使用 Date 的方法导致的精度损失。
但是,我对动态调度感到困惑。我希望Timestamp#after(Timestamp)
被调用,但Date#after(Date)
被调用了。我认为实例方法调度总是基于运行时对象。我是否错过了一些愚蠢的事情(很可能)?
java - Java Overloaded & Overridden Function call
I'm trying to understand this line:
Here's my algorithm: a has static type A and dynamic type B, so we go down the hierarchy into class B. Also, the static type of the argument, ie. b, is B, thus it's output should have been instead:
Clearly i'm wrong. I'm trying to figure this out. Can somebody help me understand where i'm wrong? If my algorithm is wrong let me know. Thanks in advance.
java - Java 动态绑定:为什么编译器无法区分被覆盖的方法
我试图在更深层次上理解动态/静态绑定,我可以说经过大量阅读和搜索后,我对某些事情感到非常困惑。
好吧,java 对重写的方法使用动态绑定,原因是编译器不知道该方法属于哪个类,对吧?例如 :
我的问题是为什么编译器不知道代码引用了 Dog 类 eat() 方法,即使 d 引用被声明为 Dog 类并且 Dog 的构造函数用于在运行时创建实例?该对象将在运行时创建,但是为什么编译器不理解代码引用了 Dog 的方法?这是编译器的设计问题还是我遗漏了什么?
java - Java - 访问者的通用界面
我使用访问者模式在类的层次结构上执行函数。例如:
因为我有不同的函数来获取一个节点并返回不同的类型,所以我为我的访问者定义了一个接口:
然后我可以为我的所有节点定义一个通用方法accept()
,它允许我定义新访问者而无需修改节点:
我现在可以在节点上定义函数,例如:
这完美地工作:
输出:
这是有效的,因为我的界面可以访问所有层次结构。我的问题是什么时候Node
定义的projectA
,它的子类定义在projectB
依赖于projectA
.
由于Node
还需要定义一个accept()
接受INodeVisitor
as 参数的方法,所以我在projectA
. 然后我可以在projectB
.
但是,这意味着我的接口需要对 的子类是通用的Node
,这似乎是不可能的。使用此界面:
我得到:
由于Java的动态调度选择了default
方法。与以下结果相同:
我发现完成这项工作的唯一方法是手动进行调度:
所以在NodeEvaluationVisitor
:
问题: Java中是否有比上面不理想的手动调度解决方案更好的解决方案?感谢您的阅读和您的建议。
编辑:我最终实现的解决方案(仍然不满意)是添加一个特定的接口,例如INodeSpecificVisitor<T>
,projectB
让访问者实现这个特定的接口,并在INodeSpecificVisitor
. 这样,至少手动调度在访问者之间进行了分解。
swift - Swift 中的动态调度和协议
考虑这个(相当乏味的)代码:
令我惊讶的是,这开始打印出来
“A的实施”
我期待它打印“B 的实现”,因为doThis(cell:header)
它作为PB
s 默认实现的一部分被覆盖。这令人惊讶地没有发生。
更有趣的是,如果我这样做:
它开始打印出来
B的实现
为什么会这样?
java - Java中的绑定和调度有什么区别?
关联的名字太多了:Early and Late Binding、Static and Dynamic Dispatch、Runtime vs. Compile-time Polymorphism等等,我不明白其中的区别。
我找到了一个明确的解释,但它正确吗?我将解释JustinC:
绑定:是确定一个变量(对象?)的类型。如果它是在编译时完成的,它的早期绑定。如果它在运行时完成,则为后期绑定。
Dispatch:正在确定哪个方法与方法调用匹配。静态分派是在编译时计算方法,而动态分派是在运行时进行。
绑定是否分别将原始变量和引用变量与原始值和对象匹配?
编辑:请给我一些明确的参考资料,以便我可以阅读更多相关信息。
java - 用子类参数重载子类(java)
我的代码与此类似:
其中 B 和 C 从 A 继承。
然后我想从这段代码中调用 Base 的 handleObject :
我希望 Sub.handleObject(B b) 为 B 类型的每个对象调用,Sub.handleObject(C c) 为 C 类型的每个对象调用,Base.handleObject(A a) 为 A 类型的对象调用。
真正的结果是它打印了三遍“A”。
是否可以使用 java 的重载功能使其工作,或者我必须自己键入检查每个对象?如果不是,实现所需行为的最佳实践是什么?
这个问题与我的非常相似,但答案只说明了为什么他的尝试没有奏效并且没有为我提供足够的解决方案。
我也尝试过使用Visitor Pattern使其工作,但在他们的示例中,Base 类(或至少是接口)似乎需要了解 Sub,这是我不希望拥有我的项目的东西。
c# - 泛型的动态调度性能
我有 30 多个类用作类的通用参数Child
。这里TKind
可以是大约 30 个类中的任何类。
构建器AddPart
对我们可以拥有的所有 30 个案例都有超载。
这不会编译:
因为this
是泛型类型,编译器无法解决方法重载。因为它不知道是否为此泛型类型提供了重载。
但这会编译,因为我们使用的是动态调度并且方法重载在运行时解决。
我担心性能。AddPart
重载可能会被调用数千次。编译器dynamic
在第一次解决每个泛型类型的重载后会优化部分吗?它知道this
在那种情况下总是相同的类型吗?
只会对每个泛型类型进行第一次调用是昂贵的调用,其余调用就像直接调用方法重载一样?
让我们举个例子。第一种方法:
我在这里假设编译器无法优化动态调用,因为item
可以是任何东西。
第二种方法:
但是在上面的例子中,我们使用了访问者模式,并且在每个泛型类中,this
总是相同的类型。所以第二种方法应该有一些优化?
scala - Scala:动态调度
考虑这个 Scala 代码:
给出的问题是:给出运行以下程序的输出:
我似乎无法完全理解给出的输出。这是我认为会发生的事情:
然而,当我真正将代码放入 REPL 时,我得到了不同的结果:
为什么是这样?我知道这与如何选择重载方法有关,但我找不到一个资源来精确指定如何确定选择哪些方法以及何时选择。如果有人可以解释确切的过程,我将不胜感激。
swift - 增加动态调度的使用会减少编译时间吗?
很快,编译时间真的很慢,项目中的代码量会增加。所以我一直在寻找减少时间的方法。一种方法可能是使用语言关键字 likefinal
或static
更改编译器在这种情况下使用静态和动态分派处理代码的方式。
但据我所知,最好避免运行时开销减少动态调度
所以我的第一个疑问是,如果在运行时使用更多动态调度尽我所能减少编译时间,但会以运行时开销为代价。
我的第二个疑问是运行时开销如此糟糕?您可以牺牲编译时间以减少开销吗?