2011-10-04 48 views
0

说我有下面的Java代码:确定物体的类型的Java

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

我想知道如何确定哪些类或接口特定对象类型有。

注意,我说的不是对象从(这里的ArrayList)实例化的类型的,而是基于该表达式的左侧的类型,以便将在上述的例子对象为MyObj中和列表为myList。

如何用恰当的说法将此称为“左手侧”类型?

另外,我该如何称为“右侧”类型?

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

问候,

回答

4

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

区分变量和对象是很有价值的 - 变量具有名称,类型和存储位置。存储位置包含与变量类型兼容的值。

我们找到的可变在执行时的类型,你需要某种形式的参考变量本身变量。例如,如果它是一个字段(静态或实例),则可以获取相应的Field引用,您可以使用Field.getType()来请求该类型。

如果这是一个本地变量你会发现它有点难。如果你能解释你想要的达到(而不是你认为会帮助你实现的机制),我们可能会帮助更多。

调用myList.getClass()之类的东西将做你想做的,因为这将处理价值myList,不是变量本身。

+0

谢谢Jon。总结一下:为了确定动态类型,我使用了getClass()。为了确定静态类型,我不得不求助于反射,更具体地说是Field.getType()。它是否正确? – balteo

+0

不要介意局部变量。实例变量就足够了。我并没有试图达成任何特定的目的。刚刚清除一些概念... – balteo

+0

再次感谢! – balteo

3

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

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

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

一种方式是通过使用函数重载:

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

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

+0

确定:myObj.appropriateMethod()== Object.class或myList.appropriateMethod()== List.class – balteo

+0

getClass将帮助我与动态类型,但不是静态类型不是吗? – balteo

+0

@balteo:没错。我已经扩展了我的答案。 – NPE