【问题标题】:Why not use Object for all method parameters?为什么不对所有方法参数使用 Object?
【发布时间】:2015-06-17 14:28:50
【问题描述】:
public class helloworld {
    public static void main(String[] args) {
        String text = "Hello World";
        l(text);
        int n = 0;
        l("--------------------------");
        l(n);   
    }

    public static void l(Object obj) {
        System.out.println(obj);
    }
}

我用 Java 编写了这个简单的程序,它运行良好。现在我很困惑,如果所有数据类型(intchardouble 等)都在Object 之下,那么为什么我们在传递值时要指定要接受的数据类型呢?

我的意思是我们总是可以使用函数l 中使用的数据类型Object。人们不总是使用Object 作为他们的数据类型来传递值是否有特定的原因?

【问题讨论】:

  • int 不是Object。它正在自动装箱为Integer

标签: java variables parameter-passing


【解决方案1】:

在所有原始类型和它们各自的对象对应物之间定义了一个隐式转换:

int -> Integer
char -> Character
etc...

这叫autoboxing

人们不总是使用“对象”作为他们的数据类型来传递值是否有特定的原因?

由于 Java 是强类型的,你不能用 Object 做很多事情。

例如试试这个:

static Object add(Object a, Object b) {
    return a + b; // won't compile
}

这是因为可用的方法、运算符等取决于变量的静态类型。

println 可以接受Object,因为它只需要调用toString 方法。如果您需要Object 中的方法提供的有限功能,那么当然,您可以将其用作类型。然而,这种情况很少发生。

【讨论】:

    【解决方案2】:

    对于您提到的原语,它们并不是真正的对象,它们只是被装箱到它们作为对象的表示中。 int 会变成Integerlong 会变成Long 等等。

    阅读这篇关于Autoboxing in java的文章。

    至于你的问题

    人们不总是使用“对象”作为 他们传递值的数据类型?

    如果您将Object 指定为方法的参数,您将无法在不进行强制转换的情况下调用真实对象包含的方法。例如,如果您有一个包含方法 anyMethod 的自定义对象 AnyObject,则如果不将该对象强制转换为 AnyObject,您将无法调用它。

    这也将是不安全的,因为您可以将任何类型的对象传递给可能无法与任何这些类型一起正常工作的方法。仅包含 System.out.println 的方法并不代表真实的用例,它适用于任何对象,因为默认情况下 println 将调用已在 Object 中定义的 toString 方法。

    【讨论】:

      【解决方案3】:

      虽然它看起来确实像一个可以接受所有类型参数的函数,但您必须处理这些

      • 函数签名的信息量减少。
      • 不再重载
      • 您必须在函数体中进行大量类型检查和强制转换以避免运行时错误。
      • 虽然该方法看似接受所有对象,但在查看方法定义之前,您永远不会知道它们的实际子集。
      • 函数体最终可能有更多的代码来消除错误类型,而不是其真正的目标。例如,您的函数仅打印值。想象一个主要执行一些整数运算的函数。
      • 增加了运行时错误的可能性,因为编译器不会因缺少强制转换而引发错误。

      【讨论】:

        猜你喜欢
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多