为什么Locale.class.isAssignableFrom([locale type] .getClass())返回false?

时间:2014-04-10 16:31:20

标签: java reflection types

在java反射tutorial page上,该示例包含此代码段

if ((pType.length != 1) || 
    Locale.class.isAssignableFrom(pType[0].getClass())) { 
  continue; 
}
  

“此外,Class.isAssignableFrom()用于确定找到的方法的参数是否与所需的调用兼容。”

我认为该代码片段试图找到Locale作为参数的方法。但是,它正在尝试查找Locale.class.isAssignableFrom(pType [0] .getClass())并跳过。有趣的是,该示例的工作方式如上所述,因为当pType [0]为Locale时,Locale.class.isAssignableFrom(pType [0] .getClass())返回false。

当pType [0]是Locale时,有人知道为什么Locale.class.isAssignableFrom(pType [0] .getClass())会返回false,检查方法参数是否为Locale的正确方法是什么?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

看起来这个例子有缺陷。对Locale.class.isAssignableFrom(pType[0].getClass())的调用返回false,因为Type.getClass()正在返回Class而不是Locale。这意味着if语句永远不会成为真,因为Type的getClass()方法似乎总是返回Class

如果你像这样在类中添加一个新方法:

private boolean testBar2(int l) { return true; }

这会导致程序抛出IllegalArgumentException,因为它会调用testBar2,即使该类型不是Locale。

Type是一个界面,调用pType[0].getClass()要求获得pType[0]的课程,Class(不是Locale),因为{{1}实现Class接口。要找出Type对象所代表的类,我们只能使用其Type方法并查看它是否为“类java.util.Locale”,因为接口中没有特定于类型的方法。 / p>

简而言之,我认为他们使用toString似乎无效,因此他们对其使用的讨论也是错误的。

答案 1 :(得分:0)

我认为这可能是对的: if ((pType.length != 1) || !Locale.class.isAssignableFrom((Class<?>) pType[0])) { continue; }