Java中JComboBox触发unchecked警告,@SuppressWarnings无效的解决咨询
解决JComboBox的unchecked警告问题
问题原因分析
这问题我太熟了!你遇到的是泛型unchecked操作警告,不是废弃API的警告,所以用@SuppressWarnings("deprecation")完全不对症,自然不会生效。具体来说:
JComboBox是泛型类,你声明变量时用了原始类型JComboBox gen;,没有指定泛型参数;- 创建实例
new JComboBox(new String[] {"Male","Female"})时,编译器无法推断出你要的JComboBox泛型类型是String,因此触发unchecked警告。
解决方案
有两种规范的处理方式,优先推荐第一种:
方式1:明确指定泛型类型(最优解)
在声明和创建JComboBox时都指定泛型参数String,从根源上消除警告:
- 变量声明改为:
JComboBox<String> gen; - 创建实例改为:
gen = new JComboBox<>(new String[] {"Male","Female"});(<>是菱形运算符,Java 7+支持自动推断泛型类型)
方式2:使用正确的SuppressWarnings注解
如果暂时不想修改泛型声明,可以用@SuppressWarnings("unchecked")注解针对性隐藏这个警告(不推荐长期这么做,泛型能提升代码类型安全性)。
修改后的完整代码
import javax.swing.*; public class Anpr extends JFrame{ ImageIcon icon; ImageIcon img3; JLabel imglab3,label3,label4,label5,label6,label7,label8,label9,label10; Dimension dimension; JTextField pid,name,cno,age,bgrp,addr,anydis; // 改动1:指定泛型类型为String JComboBox<String> gen; Anpr(){ dimension = Toolkit.getDefaultToolkit().getScreenSize(); int x=(int)((dimension.getWidth() - 650)/2); int y=(int)((dimension.getHeight() - 650)/2); setLocation(x, y); setSize(600,600); setLayout(null); icon = new ImageIcon("image/medical-record.png"); setIconImage(icon.getImage()); setTitle("Add New Patient Record"); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label3 = new JLabel("Patient ID"); label3.setBounds(150,50,80,30); label4 = new JLabel("Name"); label4.setBounds(150,90,80,30); label5 = new JLabel("Contact No"); label5.setBounds(150,130,80,30); label6 = new JLabel("Age"); label6.setBounds(150,170,80,30); label7 = new JLabel("Gender"); label7.setBounds(150,210,80,30); label8 = new JLabel("Blood Group"); label8.setBounds(150,250,80,30); label9 = new JLabel("Address"); label9.setBounds(150,290,80,30); label10 = new JLabel("Any Major Disease Suffered Earlier"); label10.setBounds(150,330,200,30); add(label3); add(label4); add(label5); add(label6); add(label7); add(label8); add(label9); add(label10); JButton btnsa=new JButton("Save"); JButton btnco=new JButton("Close"); btnsa.setBounds(150,450,80,30); btnco.setBounds(350,450,80,30); add(btnsa); add(btnco); pid = new JTextField(); pid.setBounds(270,50,180,30); name = new JTextField(); name.setBounds(270,90,180,30); cno = new JTextField(); cno.setBounds(270,130,180,30); age = new JTextField(); age.setBounds(270,170,180,30); // 改动2:使用菱形运算符自动推断泛型类型 gen = new JComboBox<>(new String[] {"Male","Female"}); gen.setBounds(270,210,180,30); bgrp = new JTextField(); bgrp.setBounds(270,250,180,30); addr = new JTextField(); addr.setBounds(270,290,180,30); anydis = new JTextField(); anydis.setBounds(150,370,300,30); add(pid); add(name); add(cno); add(age); add(gen); add(bgrp); add(addr); add(anydis); /*Background image img3 = new ImageIcon("image/m_back2.jpg"); imglab3 = new JLabel(img3); imglab3.setSize(600,600); add(imglab3);*/ } public static void main(String[] args){ Anpr apr=new Anpr(); apr.setVisible(true); } }
额外说明
- 菱形运算符
<>是Java 7引入的特性,能让编译器自动根据构造方法的参数推断泛型类型,代码更简洁; - 尽量避免使用原始类型(不带泛型参数的泛型类),这是Java 5之后就不推荐的写法,会丢失类型安全检查,也容易触发这类警告。
内容的提问来源于stack exchange,提问作者user14389228
相关产品推荐
相关产品推荐

