【问题标题】:Determining the type of an object in java在java中确定对象的类型
【发布时间】:2011-10-04 19:04:55
【问题描述】:

假设我有以下 java 代码:

Object myObj = new ArrayList();
List myList = new ArrayList();

我想知道如何确定给定对象是使用哪个类或接口键入的。

请注意,我说的不是实例化对象的类型(此处为 ArrayList),而是表达式左侧的类型,因此在上面的示例中 Object用于 myObj 和 List 用于 myList。

如何正确地称呼这种“左侧”类型?

另外,如何称呼“右手边”类型?

如何以编程方式确定这种“左侧”类型是什么?

问候,

【问题讨论】:

    标签: java types


    【解决方案1】:

    左侧使用的类型不是对象的类型。它是变量的类型。 (静态或编译时类型。)

    区分变量和对象是值得的——变量具有名称、类型和存储位置。存储位置包含与变量类型兼容的值。

    现在要在执行时找到变量的类型,您需要对变量本身进行某种引用作为变量。例如,如果它是一个字段(静态或实例),您可以获取适当的 Field 引用,您可以使用 Field.getType() 请求类型。

    如果它是一个局部变量,你会发现它有点难。如果您能解释您试图实现的目标(而不是您认为可以帮助您实现目标的机制),我们或许可以提供更多帮助。

    调用myList.getClass() 或类似的方法不会 做你想做的事,因为这将处理myList,而不是变量本身。

    【讨论】:

    • 感谢乔恩。总结一下:为了判断动态类型,我使用了getClass()。为了确定静态类型,我必须求助于反射,更具体地说是 Field.getType()。这是正确的吗?
    • 别管局部变量。实例变量就足够了。我并没有试图实现任何特定的目标。只是弄清楚一些概念......
    【解决方案2】:

    “左侧”类型称为静态类型

    “右侧”类型称为动态类型

    您可以通过调用var.getClass()来确定动态类型。

    确定静态类型的一种方法是使用函数重载:

    public static void f(Object var) { ... }
    public static void f(List var) { ... }
    

    当你调用f(var)时,编译器会使用var的静态类型来调用正确的函数。

    【讨论】:

    • 确定:myObj.appropriateMethod()==Object.class 或 myList.appropriateMethod()==List.class
    • getClass 将帮助我处理动态类型,但不是静态类型,不是吗?
    • 这是一种无需反射即可获得静态类型的有趣方式!谢谢你 aix。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2016-09-06
    • 2011-01-14
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多