问题描述
我在下面的代码中使用ois.readObject()的List赋值抛出未经检查的类型转换警告。 添加@SupressWarnings(“未选中”)会让Android Studio给我一个错误,说“这里不允许注释”。
我唯一的选择是重组整个类,以便在该行上声明List推文吗?
package com.fredliu.hellotwitter;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.fredliu.hellotwitter.models.Tweet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class TweetListActivity extends BaseListActivityWithMenu {
private List<Tweet> tweets;
private static final String cacheFile = "tweetCache.ser";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tweet_list);
try {
FileInputStream fis = openFileInput(cacheFile);
ObjectInputStream ois = new ObjectInputStream(fis);
@SuppressWarnings(value="unchecked")
tweets = (List<Tweet>) ois.readObject();
ois.close();
fis.close();
Log.d("FREDFRED", "Tweets cache read from!");
} catch (Exception e) {
Log.e("FREDFRED", "Something horrible has happened when reading from the Tweets cache");
}
if (tweets == null || tweets.isEmpty()) {
Toast.makeText(getApplicationContext(), "No stored Tweets found!", Toast.LENGTH_LONG).show();
tweets = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
Tweet t = new Tweet();
t.setTitle("Title " + i);
t.setBody("Body " + i);
tweets.add(t);
}
}
try {
FileOutputStream fos = openFileOutput(cacheFile, MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tweets);
Log.d("FREDFRED", "Tweets successfully written to cache!");
} catch (FileNotFoundException e) {
Log.e("FREDFRED", "Tweet cache file not found" + e);
} catch (IOException e) {
Log.e("FREDFRED", "Object not found when writing Tweet to cache");
}
ArrayAdapter a = new TweetAdapter(this, tweets);
setListAdapter(a);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent i = new Intent(this, TweetDetailActivity.class);
startActivity(i);
Toast.makeText(getApplicationContext(), "Position " + position + ", ID " + id, Toast.LENGTH_LONG).show();
}
}
1楼
如果要禁止单个语句的警告,只需插入以下内容:
// noinspection <checktype>
因此,对于您的情况,对于“未选中”,只需将其更改为:
// noinspection unchecked
tweets = (List<Tweet>) ois.readObject();
编辑:另一种方法是创建一些执行强制转换的独立方法,然后将注释应用于该方法。 就像是:
@SuppressWarnings("unchecked")
public static List<Tweet> asTweetList(ObjectInputStream ois) {
return (List<Tweet>) ois.readObject();
}
然后使用它:
FileInputStream fis = openFileInput(cacheFile);
ObjectInputStream ois = new ObjectInputStream(fis);
List<Tweet> tweets = asTweetList(ois);
这使得抑制范围变得紧张,并且不是特定于IDE的。
2楼
注释不能附加到表达式,语句或块。
因此,在这种情况下,您的选项是使用@SupressWarnings("unchecked")
注释私有成员推文或onCreate
方法。
如果要禁止该类的所有未经检查的警告(不推荐),您甚至可以注释整个类TweetListActivity
。