为什么不将Object用于所有方法参数?

时间:2015-04-12 03:35:56

标签: java variables parameter-passing

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下,那么我们为什么要指定我们想要的数据类型我们传递价值时接受?

我的意思是我们总是可以使用函数Object中使用的数据类型l。人们为什么不总是使用Object作为数据类型来传递值?

3 个答案:

答案 0 :(得分:21)

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

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

这称为autoboxing

  

人们为什么不总是使用"对象"作为传递值的数据类型?

由于Java是强类型的,因此您不能使用Object做很多事情。

E.g。试试这个:

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

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

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

答案 1 :(得分:8)

对于你提到的基元,它们不是真正的对象,它们只是被装箱作为对象的表示。 int将成为Integerlong将成为Long等。

阅读有关Autoboxing in java的文章。

关于你的问题

  

人们为什么不总是使用"对象"如   他们的数据类型传递值?

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

它也将是不安全的,因为您将能够将任何类型的对象传递给可能无法使用任何这些类型正常运行的方法。仅包含System.out.println的方法不能代表实际用例,它只适用于任何对象,因为默认情况下println将调用toString方法,该方法已在{ {1}}。

答案 2 :(得分:2)

虽然它看起来像一个似乎接受所有类型参数的函数,但你必须处理这些

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