Java 如何使用非at声明的泛型抑制未检查的类型转换警告?
下面是我的代码,它使用ois.readObject()中的列表分配抛出未经检查的typecast警告。添加@SupersSwarnings(“未选中”)会使Android Studio给我一个错误,说“此处不允许注释” 我唯一的选择是重新构造整个类,以便在该行声明列表tweets吗Java 如何使用非at声明的泛型抑制未检查的类型转换警告?,java,android,Java,Android,下面是我的代码,它使用ois.readObject()中的列表分配抛出未经检查的typecast警告。添加@SupersSwarnings(“未选中”)会使Android Studio给我一个错误,说“此处不允许注释” 我唯一的选择是重新构造整个类,以便在该行声明列表tweets吗 package com.fredliu.hellotwitter; import android.content.Intent; import android.os.Bundle; import android.u
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();
}
}
package com.fredliu.hellotwitter;
导入android.content.Intent;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入com.fredliu.hellotwitter.models.Tweet;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.util.ArrayList;
导入java.util.List;
公共类TweetListActivity扩展BaseListActivityWithMenu{
私人列表推文;
私有静态最终字符串cacheFile=“tweetCache.ser”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u tweet\u列表);
试一试{
FileInputStream fis=openFileInput(缓存文件);
ObjectInputStream ois=新ObjectInputStream(fis);
@抑制警告(value=“未选中”)
tweets=(List)ois.readObject();
ois.close();
fis.close();
Log.d(“FREDFRED”,“Tweets缓存读取自!”);
}捕获(例外e){
Log.e(“FREDFRED”,“从Tweets缓存读取时发生了可怕的事情”);
}
if(tweets==null | | tweets.isEmpty()){
Toast.makeText(getApplicationContext(),“未找到存储的Tweets!”,Toast.LENGTH\u LONG.show();
tweets=newarraylist();
for(int i=1;i注释不能附加到表达式、语句或块。因此,在这种情况下,您的选项是注释私有成员tweets,或使用@superswarnings(“未选中”)的方法onCreate
。如果要禁止该类的所有未经检查的警告(不推荐),甚至可以注释整个类TweetListActivity
。如果要禁止单个语句的警告,可以插入以下内容:
// noinspection <checktype>
//无检查
因此,对于您的情况,对于“未检查”,只需将其更改为:
// noinspection unchecked
tweets = (List<Tweet>) ois.readObject();
//未选中检查
tweets=(List)ois.readObject();
编辑:另一种选择是创建一些执行强制转换的独立方法,然后将注释应用于该方法。类似于:
@SuppressWarnings("unchecked")
public static List<Tweet> asTweetList(ObjectInputStream ois) {
return (List<Tweet>) ois.readObject();
}
@SuppressWarnings(“未选中”)
公共静态列表asTweetList(ObjectInputStream ois){
返回(列表)ois.readObject();
}
然后用它来代替:
FileInputStream fis = openFileInput(cacheFile);
ObjectInputStream ois = new ObjectInputStream(fis);
List<Tweet> tweets = asTweetList(ois);
FileInputStream fis=openFileInput(cacheFile);
ObjectInputStream ois=新ObjectInputStream(fis);
列表tweets=asTweetList(ois);
这使得抑制范围很窄,并且不是特定于IDE的。您说它“抛出警告”没有注释。强制转换后会发生什么?可以抛出三个不同的异常。谢谢,你的答案是一个好主意,但是我不会使用它,因为我不想禁用比需要更大范围的类型检查。这在理论上很好,但在实践中并非在所有情况下都是正确的。例如,我得到了相同的结果在某些情况下作为OP出现错误,但在其他情况下,我可以使用@SuppressWarnings(“未选中”)在一个块中间的一个语句前面,IDE没有抱怨。谢谢,这是完美的。我Google,似乎没有检查是因特利尔特的;如果这个问题是在Eclipse中出现的,分辨率是什么?我不确定在这种情况下,除了把注释移到整个方法之外,还有别的办法。(这当然不理想)。一种可以用来避免警告的方法是创建类TweetList extends List
,并使用它而不是List
。明白了,helper方法的想法非常简洁,谢谢!