You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:47:10