您可以使用类型安全接口定义List类,将不安全的List<Object>隐藏为内部实现细节。
这比直接使用List<Object> 要多。如果您的列表仅由一个类使用,只需使用List<Object>,作为该类的实现细节。 但如果您的列表被多个类访问,请考虑使用这种类型安全的方法。
首先,定义一个可以表示一个整数或整数数组的接口。
public interface IScalarOrArrayInt { }
并为每个可能的元素类型定义一个子接口:
public interface IScalarInt extends IScalarOrArrayInt {
public int getScalarInt();
}
public interface IArrayInt extends IScalarOrArrayInt {
public int[] getIntArray();
}
然后定义您的列表类及其表示。它的接口可以是List<IScalarOrArrayInt>。 表示可以是List<Object>,这样就可以直接把Integer和int[]对象放进去,不用包装对象。
public class ListOfScalarsAndArray extends AbstractList<IScalarOrArrayInt> {
private static List<Object> m_list = new ArrayList<Object>();
如AbstractList 文档中所述,您需要定义几种方法来允许修改您的列表。您可以将它们委托给内部列表,但要包装返回值。
@Override
public void add(int index, IScalarOrArrayInt element) {
m_list.add( index, element );
}
@Override
public IScalarOrArrayInt remove(int index) {
return wrap( m_list.remove( index ));
}
@Override
public IScalarOrArrayInt set(int index, IScalarOrArrayInt element) {
return wrap( m_list.set( index, element ));
}
为了方便调用者,您可以添加一些接受未包装的int 或int[] 的方法。例如:
public void add( int element ) {
m_list.add( element );
}
public void add( int[] element ) {
m_list.add( element );
}
为了满足标准的 List 接口,您可以包装返回值。您的类控制内部列表,因此它单独控制可能的列表成员类型。
private IScalarOrArrayInt wrap( Object o ) {
if ( o instanceof Integer ) {
final int i = (Integer) o;
return new IScalarInt() {
@Override
public int getScalarInt() {
return i;
}
};
}
else {
assert( o instanceof int[] );
final int[] a = (int[]) o;
return new IArrayInt() {
@Override
public int[] getIntArray() {
return a;
}
};
}
}