gpt4 book ai didi

java - Java中泛型的访问类型

转载 作者:行者123 更新时间:2023-12-04 06:05:19 25 4
gpt4 key购买 nike

我正在尝试创建一个通用的 Identifier 类,我可以按如下方式使用它:

public class TestGenericIdentifier {
public static void main(String[] args) {
Identifier<Car> carId = new Identifier<>(Car.IdentifierType.LICENSE_PLATE, "123 XYZ");
Identifier<Person> personId = new Identifier<>(Person.IdentifierType.SOCIAL_SECURITY, "123456");
System.out.println(carId);
System.out.println(personId);
}
}

为此,我首先创建了一个 Identifiable 接口(interface):
public interface Identifiable<T extends Enum> {}

这个想法是实现 Identifiable 的类需要在其声明中提供一个枚举 T,它是 Identifier 构造函数的第一个参数的类型:
public class Identifier<E extends Identifiable<T>> { //does not compile
public Identifier(T type, String value) {
//some code
}
}

现在上面的代码无法编译,因为我只能在第一行使用 Identifiable (无参数 T )。如果它有效,我将能够编写以下两个类:
public class Car implements Identifiable<Car.IdentifierType>{

public enum IdentifierType {
SERIAL_NUMBER,
LICENSE_PLATE;
}
}

public class Person implements Identifiable<Person.IdentifierType> {

public enum IdentifierType {
DATABASE_ID,
SOCIAL_SECURITY;
}
}

有没有办法使用泛型来做到这一点?

编辑
一种方法是牺牲简洁性并通过执行以下操作保持编译时类型检查:
public class Identifier<T extends Enum> {

public Identifier(T type, String value) {
}
}

主要功能变为:
Identifier<Car.IdentifierType> carId = new Identifier<>(Car.IdentifierType.LICENSE_PLATE, "123 XYZ");
Identifier<Person.IdentifierType> personId = new Identifier<>(Person.IdentifierType.SOCIAL_SECURITY, "123456");

最佳答案

public class Identifier<E extends Identifiable<? extends Enum>> {
public Identifier(Enum type, String value) {
//some code
}
}

可能足以满足您的需求

关于java - Java中泛型的访问类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8432025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com