Tag: 方法重载

多态和方法重载

我有一个快速而直接的问题: 我有这个简单的课程: public class A { public void m(Object o) { System.out.println(“m with Object called”); } public void m(Number n) { System.out.println(“m with Number called”); } public static void main(String[] args) { A a = new A(); // why will m(Number) be called? am(null); } } 更新:实际上是实际调用Number的方法。 对此感到抱歉。 如果我调用am(null),则使用Number参数调用方法。 我的问题是:这是为什么? 这个指定的java语言规范在哪里?

接受两种不同类型作为参数的方法

我正在编写一个方法,它应该接受两个类型之一的对象作为其参数,这两个类型不共享除Object之外的父类型。 例如,类型是梦想和大蒜。 你可以做dreams.crush()和garlic.crush() 。 我想有一个方法utterlyDestroy(parameter) ,它接受Dreams和Garlic作为它的参数。 utterlyDestroy(parameter) { parameter.crush() } Garlic和dream都是某些库的一部分,所以让它们实现一个接口ICrushable(这样我就可以编写utterlyDestroy(ICrushable parameter) )不是一个选项。 我的方法体很长,所以重载就意味着重复代码。 丑陋。 我相信我可以使用reflection并做一些类黑客攻击。 丑陋。 我尝试使用generics,但显然我不能写类似的东西 utterlyDestroy( parameter) 是否有可能将大蒜强加给梦想? utterlyDestroy(Object parameter) { ((Dreams)parameter).crush() } 但这仍然是丑陋的。 我的其他选择是什么?处理这种情况的首选方法是什么?

在Java中重载方法中使用null

可能重复: 方法重载NULL参数 以下代码编译并正常运行。 public class Main { public void temp(Object o) { System.out.println(“The method with the receiving parameter of type Object has been invoked.”); } public void temp(String s) { System.out.println(“The method with the receiving parameter of type String has been invoked.”); } public void temp(int i) { System.out.println(“The method with the receiving parameter of […]

方法使用Java 8三元条件和未装箱的原语过载歧义

以下是Java 7中的代码编译,但不是openjdk-1.8.0.45-31.b13.fc21。 static void f(Object o1, int i) {} static void f(Object o1, Object o2) {} static void test(boolean b) { String s = “string”; double d = 1.0; // The supremum of types ‘String’ and ‘double’ is ‘Object’ Object o = b ? s : d; Double boxedDouble = d; int i = 1; […]

关于使用int / long和String / object的参数,java中的方法重载

对于以下程序,为什么调用带有int和String参数的方法而不是long和Object? 想知道编译器为什么选择int over long和String over Object参数。 注意:这是在一次采访中被问到的。 public class MethodOverloadingTest { public static void add(int n, int m){ System.out.println(“Int method”); System.out.println(n+m); } public static void add(long n, long m){ System.out.println(“Long method”); System.out.println(n+m); } public static void method(String st){ System.out.println(“from String method”); } public static void method(Object obj){ System.out.println(“from Object method”); } /** * @param args […]

使用参数null 重载方法调用

可能重复: 方法重载NULL参数 在下面的代码中输出是 串 如果我使用String类型的参数删除方法,那么输出是 目的 我知道当参数类型不完全匹配时方法的重载是如何动作的,但是我无法理解如何将null视为Object和/或String参数。 对此有何解释? class C { static void m1(Object x) { System.out.print(“Object”); } static void m1(String x) { System.out.print(“String”); } public static void main(String[] args) { m1(null); } }

协变参数类型如何在java中工作

鉴于Date有一个名为“after(Date)”的方法,而Timestamp有一个覆盖它的方法叫做“after(Timestamp)”,为什么Date中的after方法在下面的代码中被调用? 这里提出了关于意外结果的问题。 java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L); java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L); java.util.Date oneDate = (java.util.Date) one; java.util.Date twoDate = (java.util.Date) two; System.out.println(“one: ” + oneDate.getTime()); System.out.println(“two: ” + twoDate.getTime()); if (oneDate.after(twoDate)) { System.out.println(oneDate.getTime() + ” after ” + twoDate.getTime()); } else { System.out.println(oneDate.getTime() + ” not after ” + twoDate.getTime()); } 结果 one: 1266873627200 […]

当我们将int参数传递给重载方法时会发生什么,其中float作为一个方法的参数而另一个方法具有双重参数

在重载概念,我有一个疑问,那就是。 当我使用int值重载方法时,方法调用的是float参数方法,而不是double参数方法。 void method1(float f){ System.out.println(‘float’); } void method1(double f){ System.out.println(‘double’); } 方法调用: method1(10); 输出:浮动 如此链接中的java教程中所述,如果浮点文字以字母F或f结尾,则浮点文字的类型为float; 否则它的类型是双倍的,它可以选择以字母D或d结尾。 对于上面的情况,方法调用应该调用double参数方法。 但是它调用了float参数方法。 如何在这个区域发生超载过程?

关于平等的最佳做法:过载还是不过载?

请考虑以下代码段: import java.util.*; public class EqualsOverload { public static void main(String[] args) { class Thing { final int x; Thing(int x) { this.x = x; } public int hashCode() { return x; } public boolean equals(Thing other) { return this.x == other.x; } } List myThings = Arrays.asList(new Thing(42)); System.out.println(myThings.contains(new Thing(42))); // prints “false” } […]

Java方法调用重载逻辑

对于以下代码,为什么要打印A,B? 我希望它能打印B,B。此外,JVM执行的方法调用是动态还是静态评估的? public class Main { class A { } class B extends A { } public void call(A a) { System.out.println(“I’m A”); } public void call(B a) { System.out.println(“I’m B”); } public static void main(String[] args) { Main m = new Main(); m.runTest(); } void runTest() { A a = new B(); B b […]