-1

大家好,我遇到了不安全的演员表操作的问题。这是问题所在。我必须接受或应该接受不同类型的订单(播放列表、用户操作等)的构造函数。所以我决定给它一个参数作为对象,并检查接收到的类型。问题是其中一个是参数化的 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) {

    }
}
4

2 回答 2

2

重新考虑您的设计。不要让构造函数采用Object. 这太不透明了,并且允许您的代码的使用者传递任何类型。听起来您应该改用泛型类(尽管根据您的部分示例很难判断)。可能的解决方案:

// 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);
    }
}

请记住,如果您(在编译时)知道所有可能的类型值,则使用 anenum而不是intfor可能会更好。orderTyp


旁注:如果 aList为空,则List#get(0)抛出异常,不返回null

于 2012-11-21T18:07:14.573 回答
0

而不是让构造函数接受对象重载,而是构造函数。有一个拿一个List<?>,一个拿一个UserOPect。此外,如果所有List扩展选项都来自同一界面,那将是理想的,这样您就可以拥有List<MyInterface>而不是List<?>

于 2012-11-21T18:06:34.040 回答