大家好,我遇到了一个不安全的施法操作问题。 这是问题所在。我得到了构造函数,它接受不同类型的订单(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) {
}
}
答案 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<?>