当前位置: 代码迷 >> java >> 如何使用泛型而不是声明来抑制未检查的类型转换警告?
  详细解决方案

如何使用泛型而不是声明来抑制未检查的类型转换警告?

热度:7   发布时间:2023-07-25 19:10:05.0

我在下面的代码中使用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();
    }
}

如果要禁止单个语句的警告,只需插入以下内容:

// 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的。

注释不能附加到表达式,语句或块。 因此,在这种情况下,您的选项是使用@SupressWarnings("unchecked")注释私有成员推文或onCreate方法。 如果要禁止该类的所有未经检查的警告(不推荐),您甚至可以注释整个类TweetListActivity

  相关解决方案