【问题标题】:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class;java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 [Ljava.lang.Class;
【发布时间】:2018-07-31 05:31:26
【问题描述】:

当我执行下面的代码时,我得到了 Class cast 异常。我相信一个对象正在尝试使用类进行投射,任何人都可以帮助我

 public abstract AGridFilterMenu refreshFilters();


 public AGridFilterMenu supportFilter(String style, Class<? extends AFilterItem> clazz, By... childLocators) {
      ArrayList<Class<By>> signature = new ArrayList<>();
      for(int i = 0; i< childLocators.length; i++) {
          signature.add(By.class);
      }

      try {
        Constructor<? extends AFilterItem> construct = clazz.getConstructor((Class<?>[]) signature.toArray());
        constructors.put(style, construct);
        filteritemChildLocators.put(style, childLocators);
    } catch (NoSuchMethodException | SecurityException e) {
        throw new TestCodeException("Unsupported FilterItem signature", e);
    }
      return this;
  }

  public AFilterItem getFilter(String filterName) {
    logger.trace(String.format("Retrieving filter %s", filterName));
    AFilterItem item = filters.get(filterName);`enter code here`
    item.bind();
    return item;
  }

【问题讨论】:

  • edit您的帖子并添加完整的堆栈跟踪;指出代码中的哪个语句引发了异常。
  • 请提供确切的错误,并提及您在哪一行遇到异常..
  • 请分享您的调试细节,如果您更清楚地提出问题,这里的人可以更清楚地帮助您。

标签: java arrays class exception toarray


【解决方案1】:

问题是方法Object[] List.toArray()返回一个Object的数组,它不能转换为Class&lt;?&gt;的数组。

幸运的是,有一个更合适的方法T[] List.toArray(T[]),但是你需要准备一个特定大小和类型的数组实例来存储结果。

请记住,在ArrayList 的情况下,参数和返回值都是相同的数组实例,它在toArray 方法中发生了变异。

Class<?>[] signatureArray = new Class<?>[signature.size()];
signature.toArray(signatureArray);
Constructor<? extends AFilterItem> construct = clazz.getConstructor(signatureArray);

【讨论】:

  • 您不必准备大小匹配的数组。这只是更好的性能,因为直接使用了大小匹配的数组。否则,将创建一个大小匹配的数组。我要么使用一个恒定的零大小数组,要么使用一个新的大小匹配数组。
  • @jokster,你是对的 - 该方法的精确合同在 javadoc 中。
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 2014-05-09
  • 2015-02-01
  • 2016-07-23
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多