创建未知类型的数组

时间:2011-08-10 14:13:40

标签: java arrays generics

我有一个对象,我必须验证问题的值,对象的一些属性是自定义对象的数组。这将涉及到一些无聊的阵列的各个元素。为每个元素执行getter,例如:

AttribGrp[] x =  Object.getAttribGrp()
x[i].getSomeValue()

我需要这样做。我已经使用Enum列表中的数据提取了数据 属性以下列方式。

public String getAttribValueAsString(MethodEnum attribName) 
{
    String attribValue = null;
    Object value = getAttrib(attribName.toString());

    if (value != null)
        attribValue = value.toString();

    return attribValue;
}

主叫:

    private Object invoke(String methodName, Object newValue)
{
    Object value = null;
    try
    {
        methodInvoker.setTargetMethod(methodName);

        if (newValue != null)
            methodInvoker.setArguments(new Object[]{newValue});
        else
            methodInvoker.setArguments(new Object[]{});             

        methodInvoker.prepare();
        value = methodInvoker.invoke();
    }
    catch (ClassNotFoundException e)
    {
        throw new IllegalStateException("Method invocation failed. " + e.getMessage(),e);
    }
    catch (NoSuchMethodException e)
    {
        throw new IllegalStateException("Method invocation failed. " + e.getMessage(),e);
    }
    catch (InvocationTargetException e)
    {
        throw new IllegalStateException("Method invocation failed. " + e.getMessage(),e);
    }
    catch (IllegalAccessException e)
    {
        throw new IllegalStateException("Method invocation failed. " + e.getMessage(),e);
    }
    return value;
}

我将在阵列中处理许多不同类型和不同值的数组。我想创建一个方法如下。

    public Object getAttribArray(RIORepeatingGrpEnum repeatingGrp)
{
        repeatingGrp[] grp = null;
              Object grpVal = getAttrib(repeatingGrp.toString());
              if(grp != null)
                   grp = (repeatingGrp[]) grpVal;

              return grp;
}

这给我带来了多个主要与repeatGrp []有关的错误。数组类型应与枚举名称相同。是否有可能创建一个这样的方法来创建一个未定义类型的数组?

3 个答案:

答案 0 :(得分:4)

如果您想拥有未知类型的数组,请使用泛型:

 public <T> T[] getAttribArray(Class<T> repeatingGrpClass)
 {
    //get the attribute based on the class (which you might get based on the enum for example)
    return (T[]) getAttrib( repeatingGrpClass.getName() ); //note that you might want to use the class object instead of its name here
 }

答案 1 :(得分:2)

不,您不能将变量(repeatingGrp)用作类型。

有很多方法可以进行“动态”投射,但这些对你没有帮助。 getAttribArray的返回类型为Object,这会破坏投射到特定类型的点。

即使您可以解决这个问题,但仍然不清楚您可以使用此机制做些什么。您希望能够对getAttribArray()的结果做什么?

答案 2 :(得分:0)

正如Oli Charlesworth指出的那样,你不能使用变量名来进行投射。对于通用类型,您必须转换为ObjectObject[]

Object - &gt; Object[]演员看起来非法。你可能只想要这样的直接演员:

public Object[] getAttribArray(RIORepeatingGrpEnum repeatingGrp)
{
    Object[] grp = (Object[])getAttrib(repeatingGrp.toString());
    return grp;
}