在检查实例后执行不安全的参数化ArrayList

时间:2012-11-21 18:01:43

标签: java

大家好,我遇到了一个不安全的施法操作问题。 这是问题所在。我得到了构造函数,它接受不同类型的订单(PlayList,UserOperations等)或应该。所以我决定给它一个参数作为对象,并检查一旦被调用接收的类型。问题是其中一个是参数化的ArrayList( ArrayList< PlayList> ),因为无法检查参数化的ArrayList,我必须“挖掘”。第一步我检查它是否是一个ArrayList,在第二个我进入它检查其内容的类型。 之后的问题是我得到一个不安全的演员警告,我不知道如何处理。

问候

    public Order(int aTyp, Object aOrderContent) {
    this.orderTyp = aTyp;
    if (aOrderContent instanceof ArrayList< ? >) {
        ArrayList<?> objList = (ArrayList< ? >)aOrderContent;
    if (objList.get(0) != null && (objList.get(0)) instanceof PlayList) {
        playList.addAll((ArrayList<PlayList>)aOrderContent) ;
    }        

    } else if (aOrderContent instanceof UserOP) {

    }
}

2 个答案:

答案 0 :(得分:2)

重新考虑你的设计。不要让构造函数采用Object。这太不透明,允许代码的使用者传递任何类型。这听起来应该是using a generic class而不是(尽管根据你的部分例子很难说出来)。可能的解决方案:

// Might need an upper bound on T if you want to limit the allowed parameterizations
class Order<T> {

    private final int orderTyp;
    private final List<T> someList = new ArrayList<>();

    public Order(int aTyp, List<t> aOrderContent) {
        this.orderTyp = aTyp;
        someList.addAll(aOrderContent);
    }
}

请注意,如果您知道(在编译时)所有可能的类型值,int代替orderTyp可能会更好。


附注:如果List为空,use an enum,则不返回null

答案 1 :(得分:0)

而不是使构造函数采用Object重载您构造函数。有一个人List<?>,一个人UserOP等。此外,如果List的所有选项都来自同一界面,那么您可以List<MyInterface>代替List<?>

,这将是理想的选择