当前位置: 首页 > 面试题库 >

java:获取数组组件的类

鄢承运
2023-03-14
问题内容

如果我有

public <T> doSomething(T[] array)
{
}

我怎样才能T.classarray

如果我这样做array.getClass(),那我就T[].class代替了。


问题答案:

组件类型

用这个:

array.getClass().getComponentType()

返回Class表示数组的组件类型的信息。如果此类不表示数组类,则此方法返回null

参考:

  • Class.getComponentType()

安全/不安全铸造

有没有一种方法可以从getComponentType()返回的Class强制转换为Class,而不会收到编译器警告?

采取这种方法:

public <T> void doSomething(final T[] array) throws Exception{
    final Class<? extends Object[]> arrayClass = array.getClass();
    final Class<?> componentType = arrayClass.getComponentType();
    final T newInstance = (T) componentType.newInstance();
}

这是生成的字节码:

public void doSomething(java.lang.Object[] array) throws java.lang.Exception;
     0  aload_1 [array]
     1  invokevirtual java.lang.Object.getClass() : java.lang.Class [21]
     4  astore_2 [arrayClass]
     5  aload_2 [arrayClass]
     6  invokevirtual java.lang.Class.getComponentType() : java.lang.Class [25]
     9  astore_3 [componentType]
    10  aload_3 [componentType]
    11  invokevirtual java.lang.Class.newInstance() : java.lang.Object [30]
    14  astore 4 [newInstance]
    16  return

如您所见,参数类型被擦除为Object
[],因此编译器无法知道T是什么。是的,编译器可以使用array.getClass().getComponentType(),但这有时会失败,因为您可以执行以下操作:

Object[] arr = new String[] { "a", "b", "c" };
Integer[] integerArray = (Integer[]) arr;
doSomething(integerArray);

(在这种情况下,array.getClass().getComponentType()返回String.class,但T代表Integer。是的,这是合法的,不会生成编译器警告。)



 类似资料:
  • 我正在尝试更新我编写的程序的GUI。在新的GUI上,我有一个JFrame,其中包含一个JPanel,它有一个JTabbedPane和上面的两个按钮。 在JTabbedPane中,我有三个JPanel,其中包含不同的组件。(如按钮、文本字段等)所以现在我必须让所有组件根据类型对其执行相同的操作。 如果有一个文本字段,我必须做一些事情,但如果有一个按钮,我必须做其他事情。 所以之前我做过这样的事情:

  • 问题内容: 我需要获取行和列的2D数组的长度。我已经使用以下代码成功完成了此操作: 这将按预期打印出5、10。 现在看一下这一行: 注意,实际上我必须引用特定的行才能获取列的长度。对我来说,这似乎非常丑陋。此外,如果数组定义为: 然后,当尝试获取长度时,代码将失败。有其他方法(更智能)吗? 问题答案: 考虑 每行的列长不同。如果要通过固定大小的2D数组支持某些数据,请在包装器类中为固定值提供吸气剂

  • 我有一个带有字符串的txt文件。我想通过文件获取包含文件中所有行的字符串数组。list(path.get(“path”))方法。 我试图使用toArray(),但它返回指向“path”目录中文件的路径数组 如何使用文件获取它。列表(路径。获取(“路径”))(这是必需的)?我有类似的东西

  • 代码: 为什么第二个打印5而不是20?

  • 我们的中央银行以多种方式提供货币汇率。例如,一个货币日期很容易获得:http://api.nbp.pl/api/exchangerates/rates/a/usd/2020-08-20?format=Json(它以简单的大括号开始{作为典型的Json) 但是另一个表-每个货币日期:http://api.nbp.pl/api/exchangerates/tables/a/2020-08-20?for

  • 问题内容: 我需要Java中的一个源包中包含的所有类文件的Class []。 我找不到一次就能做到的标准方法。如果有人可以编写函数来获取该列表,则将非常有帮助。 问题答案: 我可以使用普通文件I / O和搜索机制解决此问题。您可以查看此处发布的答案。