java如何将未知对象强制转换为数组

xlpyo6sf  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(237)

我有以下代码:

Object result = joinPoint.proceed();

if(result instanceof Publisher) {
  return (Publisher<?>)result;
}

if(result instanceof Iterable<?>) {
  return Flux.fromIterable((Iterable<?>)result);
}

if(result.getClass().isArray()) {
  //ERROR HERE: no instance(s) of type variable(s) T exist so that Object conforms to T[]
  return Flux.fromArray(result);
}

我想将result作为数组传递给Flux.fromArray,但我不知道如何将其强制转换为数组?或者有更好的解决方案吗?我想返回一个Publisher

pjngdqdw

pjngdqdw1#

Flux不适用于基元类型,所以如果你想使用,例如Flux.fromArray(),那么你应该把你的基元数组转换成对象数组。
为了简化转换,org.apache.commons.lang3.ArrayUtils中有ArrayUtils.toObject()方法,但它有多种实现,具体取决于原语类型:longbyteint等等。
然而,在你的情况下,你必须以某种方式确定数组中值的实际类型。这是可能的,但不是真正好的解决方案,这是因为你真的没有一个好的设计。
实现此目的的方法如下所示:

public Object[] convert(Object array) {
    Class<?> componentType = array.getClass().getComponentType();
    if (componentType.isPrimitive()) {
        if (array instanceof boolean[]) {
            return ArrayUtils.toObject((boolean[]) array);

        } else if (array instanceof int[]) {
            return ArrayUtils.toObject((int[]) array);

        } else if (array instanceof long[]) {
            return ArrayUtils.toObject((long[]) array);

        } else if (array instanceof short[]) {
            return ArrayUtils.toObject((short[]) array);

        } else if (array instanceof double[]) {
            return ArrayUtils.toObject((double[]) array);

        } else if (array instanceof char[]) {
            return ArrayUtils.toObject((char[]) array);

        } else if (array instanceof byte[]) {
            return ArrayUtils.toObject((byte[]) array);

        } else if (array instanceof float[]) {
            return ArrayUtils.toObject((float[]) array);
        }
    }
    return (Object[]) array;
}

你的代码:

if(result.getClass().isArray()) {
    return Flux.fromArray(convert(result));
}

它会按照你预期的方式工作,然而,正如我所说,它看起来像一个糟糕的设计。

相关问题