Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用非at声明的泛型抑制未检查的类型转换警告?_Java_Android - Fatal编程技术网

Java 如何使用非at声明的泛型抑制未检查的类型转换警告?

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

下面是我的代码,它使用ois.readObject()中的列表分配抛出未经检查的typecast警告。添加@SupersSwarnings(“未选中”)会使Android Studio给我一个错误,说“此处不允许注释”

我唯一的选择是重新构造整个类,以便在该行声明列表tweets吗

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方法的想法非常简洁,谢谢!