
本文旨在解决java开发中常见的“recompile with -xlint:unchecked”警告,深入探讨其产生原因——主要源于使用原始类型(raw types)的集合,如`vector`。我们将通过重构代码,采用现代java泛型(generics)和`arraylist`等类型安全的集合,演示如何消除这些警告,提升代码的可读性、健壮性及类型安全性,并纠正常见的逻辑错误。
在Java编程中,当编译器提示“recompile with -Xlint:unchecked for details.”时,这通常意味着你的代码使用了未经类型检查的操作,特别是与Java集合框架相关的操作。这种警告的出现,是因为你在使用泛型集合时没有指定类型参数,或者使用了像java.util.Vector这样的老旧且默认不带泛型的集合类,导致编译器无法在编译时进行严格的类型检查,从而可能在运行时引发ClassCastException。
原始类型(Raw Types)是指在泛型类或接口中使用时,不带类型参数的名称。例如,Vector而不是Vector<Sroom>。当使用原始类型时,集合可以存储任何类型的对象,但在取出元素时,你需要手动进行强制类型转换,这正是“未检查”警告的根源。
为了解决上述问题并提升代码质量,我们应遵循以下最佳实践:
接下来,我们将针对提供的代码进行重构,以消除警告并优化逻辑。
立即学习“Java免费学习笔记(深入)”;
原代码中Dental类使用了原始类型Vector,并且在Details方法中存在逻辑缺陷。
原代码片段:
import java.util.Vector;
public class Dental{
public Vector Sroomlist; // 原始类型 Vector
// ...
public Dental(String name, String address, int contact){
// ...
Sroomlist = new Vector(); // 初始化原始类型 Vector
}
public void addsrooms(Sroom room){
Sroomlist.addElement(room); // 使用 addElement
}
public void Details(){
// ...
int n = 0;
while (n<Sroomlist.size()){
Sroom room = (Sroom) // 需要强制类型转换,且循环体未调用 SRoomDetails
Sroomlist.elementAt(n);
n +=1;
}
}
}重构后的 Dental 类:
import java.util.ArrayList;
import java.util.List; // 导入 List 接口
public class Dental {
public List<Sroom> sRoomList; // 使用 List 接口和泛型 <Sroom>
public String name;
public String address;
public int contact;
public Dental(String name, String address, int contact) {
this.name = name;
this.address = address;
this.contact = contact;
this.sRoomList = new ArrayList<>(); // 初始化为 ArrayList,并使用钻石操作符 (<>)
}
public void addsrooms(Sroom room) {
sRoomList.add(room); // 使用 List 接口的 add 方法
}
public void Details() {
System.out.println("DENTAL SURGERY DETAILS");
System.out.println("____________________");
System.out.println("Name: " + name);
System.out.println("Address: " + address);
System.out.println("______________");
System.out.println("Contact: " + contact);
System.out.println("SURGERY ROOM DETAILS");
// 遍历并显示每个手术室的详细信息
if (sRoomList.isEmpty()) {
System.out.println("No surgery rooms added yet.");
} else {
for (Sroom room : sRoomList) { // 使用增强for循环遍历,无需手动类型转换
room.SRoomDetails(); // 调用 Sroom 的详细信息方法
}
}
}
}重构要点:
原代码中SRoomDetails方法只打印了标签,未打印实际值。
原代码片段:
public class Sroom {
public int r_id;
public String type;
public Sroom(int r_id, String type){
this.r_id = r_id;
this.type = type;
}
public void SRoomDetails(){
System.out.println("Room ID: "); // 未打印 r_id
System.out.println("Room Type: "); // 未打印 type
}
}重构后的 Sroom 类:
public class Sroom {
public int r_id;
public String type;
public Sroom(int r_id, String type) {
this.r_id = r_id;
this.type = type;
}
public void SRoomDetails() {
System.out.println(" Room ID: " + r_id); // 打印实际值
System.out.println(" Room Type: " + type); // 打印实际值
}
}重构要点:
原代码中main方法存在调用Details()的错误,因为Details()是Dental类的一个实例方法,必须通过Dental类的实例来调用。
原代码片段:
public class Composition {
public void main(String[]args){ // main 方法应为 static
Dental d = new Dental ("Dental Surgery ", "abc road",11889796);
Sroom sr1 = new Sroom (1," Surgery Room 01");
Sroom sr2 = new Sroom (2," Surgery Room 02");
Sroom sr3 = new Sroom (3," Surgery Room 03");
Details(); // 错误:直接调用实例方法
d.addsrooms(sr1);
d.addsrooms(sr2);
d.addsrooms(sr3);
d.Details();
}
}重构后的 Composition 类:
public class Composition {
public static void main(String[] args) { // main 方法必须是 static
Dental d = new Dental("Dental Surgery ", "abc road", 11889796);
Sroom sr1 = new Sroom(1, " Surgery Room 01");
Sroom sr2 = new Sroom(2, " Surgery Room 02");
Sroom sr3 = new Sroom(3, " Surgery Room 03");
// 在添加房间之前调用 Details,用于展示初始状态
System.out.println("--- Before adding rooms ---");
d.Details(); // 正确:通过 Dental 实例 d 调用 Details 方法
d.addsrooms(sr1);
d.addsrooms(sr2);
d.addsrooms(sr3);
// 在添加房间之后再次调用 Details,用于展示更新后的状态
System.out.println("\n--- After adding rooms ---");
d.Details();
}
}重构要点:
import java.util.ArrayList;
import java.util.List;
// Dental 类:管理牙科诊所及其手术室
public class Dental {
public List<Sroom> sRoomList; // 使用 List 接口和泛型 <Sroom>
public String name;
public String address;
public int contact;
public Dental(String name, String address, int contact) {
this.name = name;
this.address = address;
this.contact = contact;
this.sRoomList = new ArrayList<>(); // 初始化为 ArrayList
}
public void addsrooms(Sroom room) {
sRoomList.add(room); // 使用 List 接口的 add 方法
}
public void Details() {
System.out.println("DENTAL SURGERY DETAILS");
System.out.println("____________________");
System.out.println("Name: " + name);
System.out.println("Address: " + address);
System.out.println("______________");
System.out.println("Contact: " + contact);
System.out.println("SURGERY ROOM DETAILS");
if (sRoomList.isEmpty()) {
System.out.println(" No surgery rooms added yet.");
} else {
for (Sroom room : sRoomList) { // 使用增强for循环遍历
room.SRoomDetails(); // 调用 Sroom 的详细信息方法
}
}
}
}
// Sroom 类:表示手术室
class Sroom { // 移除 public 关键字,使其成为包私有,或者将所有类放在单独文件中
public int r_id;
public String type;
public Sroom(int r_id, String type) {
this.r_id = r_id;
this.type = type;
}
public void SRoomDetails() {
System.out.println(" Room ID: " + r_id);
System.out.println(" Room Type: " + type);
}
}
// Composition 类:主程序入口
class Composition { // 移除 public 关键字,使其成为包私有,或者将所有类放在单独文件中
public static void main(String[] args) {
Dental d = new Dental("Dental Surgery ", "abc road", 11889796);
Sroom sr1 = new Sroom(1, " Surgery Room 01");
Sroom sr2 = new Sroom(2, " Surgery Room 02");
Sroom sr3 = new Sroom(3, " Surgery Room 03");
System.out.println("--- Initial State ---");
d.Details(); // 在添加房间之前显示诊所详情
d.addsrooms(sr1);
d.addsrooms(sr2);
d.addsrooms(sr3);
System.out.println("\n--- State After Adding Rooms ---");
d.Details(); // 在添加房间之后显示诊所详情
}
}重要提示: 在一个.java文件中通常只能有一个public类,且该类的名称必须与文件名相同。如果希望所有类都为public,则需要将它们分别放在各自的文件中(例如Dental.java, Sroom.java, Composition.java)。在上述示例中,为了方便展示,Sroom和Composition类被修改为包私有(移除了public关键字),这样它们可以与public class Dental一起放在Dental.java文件中。如果需要从其他包访问它们,则必须将它们声明为public并放置在单独的文件中。
通过上述重构,我们不仅解决了“recompile with -Xlint:unchecked”警告,还显著提升了代码的质量:
作为Java开发者,理解并善用泛型和现代集合框架是至关重要的。当遇到编译器警告时,应认真对待,因为它们往往预示着潜在的运行时问题或不规范的编码实践。始终致力于编写类型安全、高效且易于维护的代码。
以上就是Java集合框架中的“未检查”警告及泛型化实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号