说我有以下java代码:
Object myObj = new ArrayList();
List myList = new ArrayList();
我想知道如何确定给定对象的类型或接口。
请注意,我不是在谈论对象是从(这里是ArrayList)实例化的类型,而是在表达式左侧的类型,所以在上面的例子中对象 myObj和myList的列表。
如何用正确的说法称这个“左手边”类型?
另外,我如何调用“右侧”类型?
如何以编程方式确定这个“左侧”类型是什么?
此致
答案 0 :(得分:4)
左侧使用的类型不是对象的类型。它是变量的类型。 (静态或编译时类型。)
值得区分变量和对象 - 变量具有名称,类型和存储位置。存储位置包含与变量类型兼容的值。
现在要在执行时找到变量的类型,你需要某种对变量本身的引用 as 一个变量。例如,如果它是一个字段(静态或实例),您可以获取相应的Field
引用,则可以使用Field.getType()
来询问类型。
如果它是局部变量,你会发现它有点困难。如果你能解释你想要实现的目标(而不是你认为可以帮助你实现它的机制),我们可以提供更多帮助。
调用myList.getClass()
或类似的不会做你想做的事情,因为这会处理myList
的值,而不是变量本身。
答案 1 :(得分:3)
“左侧”类型称为静态类型。
“右侧”类型称为动态类型。
您可以致电var.getClass()
确定动态类型。
确定静态类型的一种方法是使用函数重载:
public static void f(Object var) { ... }
public static void f(List var) { ... }
当你调用f(var)
时,编译器将使用静态类型var
来调用正确的函数。