如何实现Java泛型函数打印同键不同值的枚举键值?
解决Java泛型枚举打印指定属性的问题
要实现能打印任意枚举的NAME、LOCATION1、LOCATION2键值的泛型函数,核心是通过公共接口约束枚举的行为,让泛型能安全访问这些属性。具体实现步骤如下:
1. 定义公共接口
先创建一个接口,声明获取目标属性的方法,确保所有目标枚举都实现这个接口:
public interface EnumInfo { String getName(); String getLocation1(); String getLocation2(); }
2. 修改现有枚举实现接口
让STUDENT_INFO和PERSON_INFO实现上述接口,重写方法返回各自的枚举值:
// STUDENT_INFO枚举示例 public enum STUDENT_INFO implements EnumInfo { ALICE("Alice Smith", "Class A", "Building 1"), BOB("Bob Johnson", "Class B", "Building 2"); private final String name; private final String location1; private final String location2; STUDENT_INFO(String name, String location1, String location2) { this.name = name; this.location1 = location1; this.location2 = location2; } @Override public String getName() { return name; } @Override public String getLocation1() { return location1; } @Override public String getLocation2() { return location2; } } // PERSON_INFO枚举示例 public enum PERSON_INFO implements EnumInfo { ALICE("Alice Williams", "Street 1", "City X"), BOB("Bob Brown", "Street 2", "City Y"); private final String name; private final String location1; private final String location2; PERSON_INFO(String name, String location1, String location2) { this.name = name; this.location1 = location1; this.location2 = location2; } @Override public String getName() { return name; } @Override public String getLocation1() { return location1; } @Override public String getLocation2() { return location2; } }
3. 实现泛型打印函数
通过泛型参数限定为Enum & EnumInfo,确保传入的类型既是枚举,又实现了我们定义的接口,这样就能安全调用属性方法:
public class EnumPrinter { public static <E extends Enum<E> & EnumInfo> void printGenericEnumInfo(Class<E> enumClass) { for (E enumConstant : enumClass.getEnumConstants()) { System.out.printf("枚举项: %s%n", enumConstant.name()); System.out.printf("NAME: %s%n", enumConstant.getName()); System.out.printf("LOCATION1: %s%n", enumConstant.getLocation1()); System.out.printf("LOCATION2: %s%n%n", enumConstant.getLocation2()); } } // 测试调用 public static void main(String[] args) { System.out.println("===== 学生信息 ====="); printGenericEnumInfo(STUDENT_INFO.class); System.out.println("===== 个人信息 ====="); printGenericEnumInfo(PERSON_INFO.class); } }
关键说明
- 泛型约束
E extends Enum<E> & EnumInfo:既保证了类型是枚举(能通过getEnumConstants()获取所有枚举项),又保证了能调用getName()等方法获取目标属性。 - 这种方式避免了使用反射(反射会降低代码安全性和可读性),通过接口实现编译期类型检查。
内容的提问来源于stack exchange,提问作者ArtBindu
相关产品推荐
相关产品推荐

