为什么不对所有方法参数都使用 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 中编写了这个简单的程序并且它工作了。现在我很困惑,如果所有数据类型(int
、char
、double
等)都属于 Object
,那么为什么我们要指定我们想要的数据类型当我们传递值时接受?
我的意思是我们总是可以使用函数 l
中使用的数据类型 Object
。为什么人们不总是使用 Object
作为他们的数据类型来传递值有什么具体原因吗?
对于您提到的基元,它们并不是真正的对象,它们将被简单地装箱到它们作为对象的表示中。 int
会变成 Integer
,long
会变成 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
中方法提供的有限功能,那么当然,您可以将其用作类型。然而,这种情况很少见。
虽然它看起来确实像是一个接受所有类型参数的函数,但您将不得不处理这些
- 函数签名的信息量变少了。
- 不再重载
- 您必须在函数体中进行大量类型检查和转换以避免 运行 时间错误。
- 虽然该方法看似接受所有对象,但在您看到方法定义之前,您永远不会知道它们的实际子集。
- 函数体最终可能会包含比其真正目标更多的代码来消除错误的类型。例如,您的函数仅打印值。想象一个主要执行一些整数运算的函数。
- 增加了 运行 时间错误的可能性,因为编译器无法为缺少的转换抛出错误。
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 中编写了这个简单的程序并且它工作了。现在我很困惑,如果所有数据类型(int
、char
、double
等)都属于 Object
,那么为什么我们要指定我们想要的数据类型当我们传递值时接受?
我的意思是我们总是可以使用函数 l
中使用的数据类型 Object
。为什么人们不总是使用 Object
作为他们的数据类型来传递值有什么具体原因吗?
对于您提到的基元,它们并不是真正的对象,它们将被简单地装箱到它们作为对象的表示中。 int
会变成 Integer
,long
会变成 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
中方法提供的有限功能,那么当然,您可以将其用作类型。然而,这种情况很少见。
虽然它看起来确实像是一个接受所有类型参数的函数,但您将不得不处理这些
- 函数签名的信息量变少了。
- 不再重载
- 您必须在函数体中进行大量类型检查和转换以避免 运行 时间错误。
- 虽然该方法看似接受所有对象,但在您看到方法定义之前,您永远不会知道它们的实际子集。
- 函数体最终可能会包含比其真正目标更多的代码来消除错误的类型。例如,您的函数仅打印值。想象一个主要执行一些整数运算的函数。
- 增加了 运行 时间错误的可能性,因为编译器无法为缺少的转换抛出错误。