我已经看完了这个演讲。
幻灯片编号:26引用
Java language does not allow overloading on return type
Java Virtual machine does allow overloading on return type
这些说法正确吗? 如果两个语句都正确,那么如何使代码可编译,以便jvm运行代码?
提前致谢。
这些说法是完全正确的。
请记住,Java是两件事-
一是语言,其二是虚拟机。尽管将语言限制为不允许基于类型的方法重载使Java成为一种更简单的语言,但JVM仍可以允许这样做以使其更强大。
作为一种语言,Java具有一种编译器,该编译器执行的规则使Java成为比允许这样做的语言更简单,更轻松的编程语言。为此,它限制了您只能在Java语言本身中执行的操作。在JVM上运行诸如Scala或Ruby之类的东西需要不同的规则和功能,在此级别上,重要的是JVM必须具有灵活性,以使JVM取得如此巨大的成功,以至于在许多平台和设备上都能找到。
在可能通过返回类型重载的语言中,这将很容易出错,并且不支持该功能的决定是故意使Java成为不易出错的编程语言。编译器将如何知道您打算调用哪个函数?
另一方面,JVM是存在的底层,高度优化的虚拟机,用于运行字节码而不是Java。因此,以这种方式限制JVM是不明智的,因为它应该能够运行根本不是从Java生成的字节码。
另一个例子是多重继承,这在Java中不可用,但是没有什么可以阻止您编写支持多重继承并将其编译为字节码的语言。这将使您的语言更难以使用,并且可能更容易出错,但是如果您需要该功能,JVM不会阻止您。
考虑以下代码: 我得到了错误 on-但我真的希望能够将类型检查移动到此函数中,因为这减少了我必须将类型检查到一个位置的次数。
如果我在java中有一个抽象的(或据我所知的)超类,如下所示: 我注意到,在重写这个方法时,子类可以使用自身作为返回类型,但不能使用参数: 为什么不允许这样做?我不是在寻求解决方案——我知道我可以在方法中使用< code>instanceof检查或其他方法,我更想知道为什么前者是可以接受的,而后者对编译器来说却不是。
来自标书§4.2.7http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html#pathological-案例 它说: 这些更不可能是真正有用的代码。在此示例中,既不能转换为也不能转换为,因此这些函数甚至都不能使用普通成员语法调用。但是,您可以获取指向此类函数的指针并通过该指针调用它们。
问题内容: 我可以定义setter方法以返回此方法而不是void吗? 喜欢: 然后我可以使用新的ClassA()。setItem1()。setItem2() 问题答案: 关于JavaBeans规范有很多误解。 它存在的主要原因是统一的Java“组件”模型。这是一种使用反射与Java对象进行编程交互的方式。该API本身名为JavaBeans Introspection 。请看一下示例用法,您将比普通
我在我的Web服务器(Debian/Nginx/Gunicorn)上运行Redis进行会话存储,我有理由相信我的Redis服务器遭到了黑客攻击。这绝对是可能的,因为如果我在另一台机器上针对web服务器运行命令“redis cli-h(HOST IP)”,我就可以进入控制台并运行命令。我有两个问题。首先,如果我在我的iptables文件中添加一个新的部分,如下所示,我会正确地阻止除Web服务器本身之
相比之下,Java确实允许虚拟泛型方法。这里也清楚了如何实现:Java泛型在运行时被删除,因此泛型方法是运行时的常用方法,因此不需要修改。 但是现在到了C#。C#确实有具体化的泛型。对于具体化泛型,特别是当使用值类型作为类型参数时,泛型方法必须有不同的版本。但是我们遇到了与C++相同的问题:每当对泛型方法进行新的实例化时,我们都需要修改vtable。 我对C#的内部工作没有太深的了解,所以我的直觉