【杂谈】Raw use of parameterized class ‘List‘ 解决方案

警告: Raw use of parameterized class ‘ArrayList‘ 代码 @Test public void test2(){ ArrayList list2 = new ArrayList(); // 此处报警 list2.add(123); list2.add(456); list2.add("AA"); list2.add(new Person("Tom", 12)); list2.add(789); System.out.println(list2); } 原因 使用原始类型(没有类型参数的泛型)是合法 阅读详情
AI摘要

本文围绕IDEA插件对Java中'List'原始使用的告警展开。先描述了在写线性表实现类时出现告警的问题,接着分析是因未添加泛型,回顾了泛型相关知识,指出要将类变成泛型类。最后给出添加通配符解决告警的方法,提醒工作中注意泛型指定。

Raw use of parameterized class 'List' 解决方案

0. 前言

IDEA 插件告警描述 Raw use of parameterized class 'List' 问题分析及解决方案。

注意这只是告警,并不是错误,若不是强迫症或者代码要求非常严格,可以忽略。强迫症福音!

参考解决方案
优快云-优秀参考博文

1. 问题描述

某天风和日丽,空气清新,虽然是996,但同事请假了,某些要通力合作的业务只能放缓,工作任务暂时空缺,是自己写点东西的好时机。

于是,我兴致勃勃地打开了尘封已久的《数据结构》,并照着教程打算自己用Java写一个线性表。

我们知道,Java实现数据结构有个小优势,ADT可以用接口取代,因此我写了如下接口:

public interface ILinearList<T> {
    /**
     * if it is empty
     * @return if it is empty return true, else return false
     */
    boolean isEmpty();

    /**
     * return this list's length
     * @return length
     */
    int size();

    /**
     * get the element from index i
     * @param i index
     * @return element in index i
     */
    T get(int i);

    /**
     * set x into index i
     * @param i index
     * @param x element
     * @return if it is success
     */
    boolean set(int i, T x);

    /**
     * toString
     * @return string value
     */
    @Override
    String toString();

    /**
     * insert x into index i
     * @param i index
     * @param x element x
     * @return index
     */
    int insert(int i, T x);

    /**
     * insert x into the tail of the list
     * @param x element x
     * @return index
     */
    int insert(T x);

    /**
     * remove elements in index i
     * @param i index i
     * @return element in index i
     */
    T remove(int i);

    /**
     * search element equals key
     * @param key key
     * @return index
     */
    int search(T key);

    /**
     * if this
     * @param key key element
     * @return if it contains this element
     */
    boolean contains(T key);

    /**
     * insert different element
     * @param x target element
     * @return if contains that element, return -1, else return index
     */
    int insertDifferent(T x);

    /**
     * remove target key
     * @param key target
     * @return target key
     */
    T remove(T key);

    /**
     * equals another liner list
     * @param obj liner list
     * @return if it is equals
     */
    @Override
    boolean equals(Object obj);

    /**
     * override hash code
     * @return hash code
     */
    @Override
    int hashCode();

    /**
     * add another liner list
     * @param list target list
     * @return if it is success
     */
    boolean addAll(List<T> list);
}

使用接口定义了ADT的操作之后,就是要写实现类了,实现类一开始的时候如下:

public class SequenceTable implements ISequenceTable {


    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public Object get(int i) {
        return null;
    }

    @Override
    public boolean set(int i, Object x) {
        return false;
    }

    @Override
    public int insert(int i, Object x) {
        return 0;
    }

    @Override
    public int insert(Object x) {
        return 0;
    }

    @Override
    public Object remove(int i) {
        return null;
    }

    @Override
    public int search(Object key) {
        return 0;
    }

    @Override
    public boolean contains(Object key) {
        return false;
    }

    @Override
    public int insertDifferent(Object x) {
        return 0;
    }

    @Override
    public Object remove(Object key) {
        return null;
    }

    @Override
    public boolean addAll(List list) {
        return false;
    }
}

在具体方法还没写的时候,IDEA报如下告警:
Raw use of parameterized class 'List'
1

2. 问题分析

告警翻译:
参数化类“List”的原始使用

由于集合框架包含了许多Java开发者常用的数据结构,集合框架一般是通用的。因此我们在实际使用的时候通常会使用泛型来规范类型。但是呢,在泛型出现之前,List 等集合是没有类型规范的,因此我在生成这个List 重写方法的时候,没有添加泛型,就被工具插件判定为原始使用。

原始使用
在没有进行泛型指定类型或者进行类型通配时,一个集合是可以存放不同类型的数据的。这就导致了当要批量处理时,每次都要进行类型转换或开发者要严格根据每次存放的类型对应取出进行操作。这就容易出错且开发成本高。
当然,原始使用现在依然保留,是因为它依然具有灵活性,但实际开发中,现在一般只有特殊情况才原始使用。

说白了,就是没有添加泛型。

泛型
顺势来复习一下泛型吧。

  • 泛型标记符
表记符含义
EElement,表示集合的元素
TType,表示类型。实际使用中,其实使用A、B等都可以,一般约定俗称用Type
KKey 键
VValue 值
NNumber 数值类型
?通配符,表示不确定的类型

实际使用中,由于使用方便与约定俗成的关系,我们最常用的泛型标记符还是 T和 ?

  • 泛型接口

    • 语法
      在接口名后添加泛型:
interface GenericsInterface<T> {
	T method(T t);
	// other methods ...
}
    • 作用
      如果一个接口使用了泛型,那么实现该接口的类可以就可以指定类型,举个例子:
interface GenericsInterface<T> {
	/**
	 * 泛型接口演示
	 * @param t 泛型对象t
	 * @return 返回泛型对象
	 */
	T method(T t);
}
public class Cat extends Animal implements GenericsInterface<Cat> {
    private String color;

    public void voice(){
        System.out.println("mao mao");
    }

    @Override
    public Cat method(Cat cat) {
        return null;
    }
}

当我们实现泛型接口,而不指定泛型时,默认为Object:

public class Cat extends Animal implements GenericsInterface {
    private String color;

    public void voice(){
        System.out.println("mao mao");
    }

    @Override
    public Object method(Object o) {
        return null;
    }
}

  • 泛型类

    • 语法
      在类名后添加泛型:
class GenericsClass<T> {
	T method(T t);
	// other methods ...
}

当我们实例化这个泛型类的对象时,就可以指定泛型了。

    • 举例:
public class MyStack <T> {

    LinkedList<T> values = new LinkedList<>();

    public void push(T t){
        values.addLast(t);
    }

    public T pull(){
        return values.removeLast();
    }

    public T peek(){
        return values.getLast();
    }

    public static void main(String[] args) {
        MyStack<Car> carStack = new MyStack<>();
        carStack.push(new Car());
        carStack.push(new Car());
        carStack.peek();
        Car pull = carStack.pull();

        MyStack<Cat> catMyStack = new MyStack<>();
        catMyStack.push(new Cat());
        catMyStack.push(new Cat());
        catMyStack.push(new Cat());
        Cat cat = catMyStack.pull();
    }
}

经过上述泛型的回顾,我们可以得知,出现该告警,直接添加泛型也是不行的,因此我们要先将类变成泛型类。下面介绍详细解决代码。

3. 问题解决

我个人练习所写的ADT是使用了泛型通配符,因此实际解决时,我们也将实现类添加上通配符,告警消失,代码如下:

public class SequenceTable<T> implements ISequenceTable<T> {

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public T get(int i) {
        return null;
    }

    @Override
    public boolean set(int i, T x) {
        return false;
    }

    @Override
    public int insert(int i, T x) {
        return 0;
    }

    @Override
    public int insert(T x) {
        return 0;
    }

    @Override
    public T remove(int i) {
        return null;
    }

    @Override
    public int search(T key) {
        return 0;
    }

    @Override
    public boolean contains(T key) {
        return false;
    }

    @Override
    public int insertDifferent(T x) {
        return 0;
    }

    @Override
    public T remove(T key) {
        return null;
    }

    @Override
    public boolean addAll(List<T> list) {
        return false;
    }
}

接下来,可以愉快地实现这个类了!

4. 总结

以上问题出现在我个人的练习。实际工作中,需要注意通用工具类以及实现类的泛型指定!

JAVA泛型总结 java 泛型详解 实例 class Point class Notepad{ // 此处指定了两个泛型类型 } 通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组、泛型的嵌套设置 立即下载

相关推荐

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

一文读懂<explain>索引优化

对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?主要解决办法有:监控sql执行情况,发邮件、短信报警,便于快速识别慢查询sql打开数据库慢查询日志功能简化业务逻辑代码重构、优化异步处理sql优化索引优化其他的办法先不说,后面有机会再单独介绍。...

慕白Lee的博客 5万+

基于单片机控制的开关电源设计

采用开关电源技术和MCU模块,凭借可靠性高、易于调适的特点,可以更高效地发挥出二者的优势,从而实现更好的组合。stm32的起动模式是通过Boot0和Boot1两个管脚的高低电平来决定的,当stm32被供电之后,这两个管脚的电平。在 VCC上,键盘的一头(列线)被连接到 VCC上,而在“0”的编程输出中,则用来进。,在开关管打开的情况下,由输入电力供给电流,感应装置存储   Buck变换器是一种非隔离式的电压转换器[10]整流电路对输入电压进行整流,再经过滤波电路,即Dc电压是直流/直流变换器的直流输入。

QQ1694456187的博客 2309

Java泛型总结

关于泛型,最根本的理解就是: 泛型提供了编译时类型安全检测机制,该机制允许程序在编译时检测到非法的类型,以保证类型安全。泛型的本质是参数化类型,在面向对象编程的语言中,允许程序员在强类型校验下定义某些可变部分,以达到代码复用的目的...

m0_49496327的博客 1万+

基于pytest+Allure+Python+CANoe的汽车诊断自动化测试框架搭建实战

自动化测试是提升软件质量和研发效率的关键技术,其核心原理是通过脚本模拟人工操作,实现测试用例的自动执行与结果验证。在汽车电子领域,诊断服务测试是确保车辆ECU(电子控制单元)功能正常的重要环节,传统手动测试在面对海量用例和频繁回归时效率低下。本文聚焦于如何利用Python的pytest测试框架、Allure报告工具以及Excel数据驱动,构建一个与Vector CANoe仿真测试环境深度集成的自动化测试解决方案。该方案通过Python调用CANoe的COM接口,实现了诊断报文的自动发送与响应验证,并结合Al

weixin_30384217的博客 680

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 283

什么是JAVA泛型的原生类型(raw type),为什么不建议使用?

java泛型中raw type的来源,以及使用事项

weixin_44670774的博客 4874

UNSW-NB15数据集:网络流量分析与恶意攻击检测实战指南

本文提供了UNSW-NB15数据集在网络流量分析与恶意攻击检测领域的实战指南。详细介绍了该数据集的构成、核心特征解析、特征工程处理、机器学习模型训练与评估方法,并探讨了模型部署及持续优化的挑战与思路,帮助读者构建高效的网络攻击检测系统。

weixin_29193359的博客 260

Raw use of parameterized class ‘xxxx‘ 警告

Raw use of parameterized class 'xxxx' 警告 参数化类的原始使用 泛型不要使用原生态类型 会导致 丢失类型安全性 意思是这个类要使用泛型 在类后面加上,<> 对应泛型 例如 FilterRegistrationBean FilterRegistrationBean<HeaderFilter> // HeaderFilter 自定义的过滤器 为什么会出现这个警告? 因为 FilterRegistrationBean 是一个泛型类 FilterR

OneSeek的博客 15万+

Vivado IP核:AXI Uartlite的使用经验分享

1. IP基本设置 在Vivado中,打开IP Catalog,搜索“uart”: 双击“AXI Uartlite”,进入IP配置界面: 这里可以配置IP的具体参数,设置时钟频率、波特率等,完成后,生成IP即可。 2. IP的时序特点 点击下面的链接可以下载该IP核的官方指导文档: https://china.xilinx.com/support/documentation/ip_docume...

weixin_43265132的博客 1万+

贝叶斯核机回归估计混合物健康效应 【BKMR包】——实操篇

使用 ggplot2包绘制 h 的截面# 绘制总体风险摘要。

三分钟热度 5383

【Raw use of parameterized class ‘xxx‘ 】

Raw use of parameterized class 'xxx'

Java_Rookie_Xiao的博客 1万+

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

IDEA警告合集

在IDEA 里面的一些类及方法,有被其他的类或者方法调用,但是去看的时候显示灰色,鼠标放上面的时候显示:Class ‘XXX’ is never used或者Method ‘XXX’ is never used,并且运行正常。解决方法:刷新项目缓存idea点击 File -- > Invalidate Caches/Restart注意有些版本idea把Invalidate Caches/Restart拆分成两两项了,小心点错。

weixin_47000379的博客 4311

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于定义ArrayList泛型警告“Raw use of parameterized class ‘ArrayList‘ ”的解决方法

比如你定义如下: List<String> result= new ArrayList(); 有警告但是可以正常工作,修改成下面这样就行了 List<String> result= new ArrayList<>();

wh445306 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

消除Android中代码警告

消除Android 代码警告

weixin_42277946的博客 3992

Raw use of parameterized class部分解决方法

【代码】Raw use of parameterized class部分解决方法。

alisande1的专栏 6943

IntelliJ IDEA - Raw use of parameterized class

IntelliJ IDEA - Raw use of parameterized class

3345

Java官方笔记8泛型

泛型 为什么需要泛型?generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 说白了就像Python动态语言的变量,是动态的,可以指向任意类型。 泛型有个好处是不需要类型转换: List list = new ArrayList...

自动化代码美学 799

警告:Raw use of parameterized class ‘R‘

原因:泛型类的使用不规范。 不要使用原生态类型 会导致 丢失类型安全性。 使用时确定泛型类型。

liuy__257 1万+

ChatGPT:Raw use of parameterized class ‘R‘ 是什么错误?

ChatGPT:Raw use of parameterized class 'R' 是什么错误?

XRT_knives的博客 1182

IDEA代码警告(warning)整理以及解决办法

Redundant boxing inside ‘Integer.valueOf(xx)’ 解决办法: 改为Integer.parseInt(xx)即可。因为Integer.valueOf内部调用了parseInt,会提示多余的拆箱操作 ‘xxx == null ? false : yyy’ can be simplified to 'xxx!=null && yyy 解决办法: 按照提示修改即可。简化写法,原来写法比较啰嗦 ‘OptionalInt.getAsInt()’ witho.

笔墨的专栏 5万+

Raw use of parameterized class 处理

起初: Enumeration<String> paraNames3=request.getParameterNames(); 我的警告是Unchecked assignment: 'java.util.Enumeration' to 'java.util.Enumeration<java.lang.String>' 改为 Enumeration paraNames2=request.getParameterNames(); 我的警告是,Raw use of param

su330494482的博客 2万+

在使用redis pipeline时,警告raw use of parameterized class DefaultTypedTuple

在使用redis pipeline时,警告raw use of parameterized class DefaultTypedTuple

hahaha_1112的博客 5643

Raw use of parameterized class ‘TestNode‘ 警告

Raw use of parameterized class 'TestNode' 警告

专业深耕,技术前沿 709

去除 idea warn Raw use of parameterized class ‘Map‘

链接:http://note.youdao.com/noteshare?去除 idea warn Raw use of parameterized class ‘Map’文档:Raw use of parameterized class ‘Map’…

jonathan_joestar的博客 2212
上一篇: 【计算机基础】计算机网络体系结构与协议概述
下一篇: 【计算机基础】数据结构与算法基本概念
CoderSharry
博客等级 码龄4年 515粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值