Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
744 views
in Technique[技术] by (71.8m points)

android - Type safety: Unchecked cast from Object to List<MyObject>

I have a ListView listing a custom object (let's say MyObject).

I want to filter it dynamically through an EditText so I had to implement a getFilter() with a publishResults method:

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    MyObjectAdapter.this.setItems((List<MyObject>) results.values);
    MyObjectAdapter.this.notifyDataSetChanged();
}

At this point, Eclipse complains: Type safety: Unchecked cast from Object to List<MyObject>

I am sure this cast will always be true, but Eclipse only suggests to add @SuppressWarnings("unchecked") but I'm totally against SuppressWarnings because it's only hiding the problem, not a solution...

I tried adding:

if(results.values instanceof List<MyObject>)

But Eclipse complains again, and this solves nothing...

Cannot perform instanceof check against parameterized type List<MyObject>. Use the form List<?>

I know the casting will always be correct, but which is the proper way to make the code to be sure results.values is actually a List<MyObject> ?

Thanks in advance!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If all you have to work from is an Object, then you can't check at runtime that you actually have a List<MyObject>, because the generic type MyObject is only used for compile-time type checking, it is not available at runtime. This is why you get an error when you try to add the instanceof check.

If you are sure that your Object really is always a List<MyObject> then I'd say the @SuppressWarnings is OK, if you document why you are sure it is not a problem.

If you absolutely want to avoid a warning though, you could create your own List implementation (say, MyObjectList) that is not itself generic but implements List<MyObject>. Then you can do an instanceof check against MyObjectList at runtime.

Another option is to check for and cast to List<?> as the instanceof error suggests. Then you can iterate over the elements in the list and check if they are actually all instances of MyObject, and copy them to a new List<MyObject>.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...