gpt4 book ai didi

java - 具有通用签名的接口(interface)中的静态方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:12 24 4
gpt4 key购买 nike

从 Java 8 开始,您可以在接口(interface)中实现默认或静态方法,如下所示

public interface DbValuesEnumIface<ID, T extends Enum<T>> {
T fromId(ID id);

ID getId();
static String getDescriptionKey(){
return "this is a test";
}
}

我想用具有签名的静态方法声明上述内容,该签名使用由实现类定义的边界,因为方法的实现对所有方法都应该相同,唯一不同的应该是泛型声明,如下所示:

public interface DbValuesEnumIface<ID, T extends Enum<T>> {

public static T fromId(ID id) {
if (id == null) {
return null;
}
for (T en : T.values()) {
if (en.getId().equals(id)) {
return en;
}
}
}

ID getId();

String getDescriptionKey();
}
...
public enum Statuses implements DbValuesEnumIface<Integer,Statuses>

因为 T 和 ID 不是静态的并且不能从静态上下文中引用而中断。

那么,应该如何修改上面的代码才能成功编译,如果不可能的话,应该如何实现上面的代码来达到预期的目的,同时避免在实现类中重复代码。

最佳答案

因为static之间没有关系方法和类的类型参数,它们描述了实例是如何被参数化的,你必须制作 static方法本身通用。棘手的部分是让声明正确地描述所有需要的约束。而作为 this answer已经解释过了,你需要一个 Class参数,否则,实现没有机会获得实际的类型参数:

public interface DbValuesEnumIface<ID, T extends Enum<T>> {

public static
<ID, T extends Enum<T>&DbValuesEnumIface<ID,T>> T fromId(ID id, Class<T> type) {
if (id == null) {
return null;
}
for (T en : type.getEnumConstants()) {
if (en.getId().equals(id)) {
return en;
}
}
throw new NoSuchElementException();
}

ID getId();

String getDescriptionKey();
}

注意 static 的类型参数方法独立于类的类型参数。为清楚起见,您可以考虑给它们不同的名称。

所以现在,给你enum Statuses implements DbValuesEnumIface<Integer,Statuses>例如,您可以使用类似 Statuses status = DbValuesEnumIface.fromId(42, Statuses.class); 的方法


注意对于 default方法,可以访问实际类型,如 method providing the enum type将由实现提供。您只需在 interface 中声明该方法的存在。 :

public interface DbValuesEnumIface<ID, T extends Enum<T>&DbValuesEnumIface<ID,T>> {

public default T fromId(ID id) {
if (id == null) {
return null;
}
for (T en : getDeclaringClass().getEnumConstants()) {
if (en.getId().equals(id)) {
return en;
}
}
throw new NoSuchElementException();
}
Class<T> getDeclaringClass();//no needed to implement it, inherited by java.lang.Enum
ID getId();
String getDescriptionKey();
}

然而,明显的缺点是您需要一个目标实例来调用该方法,即 Statuses status = Statuses.SOME_CONSTANT.fromId(42);

关于java - 具有通用签名的接口(interface)中的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430424/

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