为什么不对所有方法参数都使用 Object?

Why not use Object for all method parameters?

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 会变成 Integerlong 会变成 Long 等等

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

关于你的问题

Is there a specific reason why people don't always use "Object" as their data type to pass values?

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

的情况下调用它

这也是不安全的,因为您可以将任何类型的对象传递给一个方法,而该方法的设计可能不适用于这些类型中的任何一种。仅包含 System.out.println 的方法不代表实际用例,它适用于任何对象,因为默认情况下 println 将调用 toString 方法,该方法已在 Object

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

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

这叫做autoboxing

Is there a specific reason why people don't always use "Object" as their data type to pass values?

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

例如试试这个:

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

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

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

虽然它看起来确实像是一个接受所有类型参数的函数,但您将不得不处理这些

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