@Override
  public Object unbox() {
    switch (type) {
      case STRING_ARRAY:
        String[] arrays = new String[val.length];
        for (int i = 0; i < arrays.length; ++i) {
          arrays[i] = ((SelString) val[i]).getInternalVal();
        }
        return arrays;
      case LONG_ARRAY:
        long[] arrayl = new long[val.length];
        for (int i = 0; i < arrayl.length; ++i) {
          arrayl[i] = ((SelLong) val[i]).longVal();
        }
        return arrayl;
      case DOUBLE_ARRAY:
        double[] arrayd = new double[val.length];
        for (int i = 0; i < arrayd.length; ++i) {
          arrayd[i] = ((SelDouble) val[i]).doubleVal();
        }
        return arrayd;
      case BOOLEAN_ARRAY:
        boolean[] arrayb = new boolean[val.length];
        for (int i = 0; i < arrayb.length; ++i) {
          arrayb[i] = ((SelBoolean) val[i]).booleanVal();
        }
        return arrayb;
    }
    throw new UnsupportedOperationException("Not support to unbox an array with type " + type);
  }
@Test
  public void unbox() {
    assertArrayEquals(new String[] {"foo", "bar"}, (String[]) one.unbox());
    assertArrayEquals(new long[] {1, 2, 3}, (long[]) another.unbox());
  }