gpt4 book ai didi

java - 访问实现接口(interface)的通用枚举的父方法

转载 作者:行者123 更新时间:2023-11-30 03:50:52 28 4
gpt4 key购买 nike

好的,我目前正在定义通用枚举参数,如下所示:

public interface MyInterface
{
public int GetValue ( );
}

public enum MyEnum implements MyInterface
{
value1(1), value2(2);

int myvalue;

MyEnum ( int value )
{
this.myvalue = value;
}

public int GetValue ( )
{
return this.myvalue;
}
}

public class PassGeneric
{
public void AcceptsGeneric ( Enum<? extends MyInterface> generic_enum )
{
generic_enum.values(); // Not valid
generic_enum.GetValue(); // Not valid
generic_enum.getDeclaringClass().getEnumConstants(); // Valid
((Enum<?>)generic_enum).values(); // Not Valid
((MyInterface)generic_enum).GetValue(); // Valid
}
}

我只是想理解为什么类型说明符 Enum<? extends MyInterface>不允许我 1) 直接访问 MyInterface方法,2) 直接访问 Enum 方法,例如 .values() .

类型转换可用于访问 MyInterface方法,但对我来说,这违背了指定泛型类型扩展 MyInterface 的目的因为替换 Enum<? extends MyInterface> 仍然是合法的与 Enum<?>并将对象转换为 (MyInterface) .

如果我误解了泛型的使用并实现 extends有人可以向我解释如何正确地显式指定泛型实现给定的接口(interface)。

最佳答案

您无法访问 values()因为它不是实例方法;它是属于枚举类型的静态方法。因此传递父类(super class) Enum 的实例没有为您提供所需的信息。

就接口(interface)方法而言,声明 Enum<? extends MyInterface>声明了有关枚举的某些通用信息,但没有告诉编译器 generic_enum本身就是 MyInterface 的一个实例.

如果你想声明generic_enum实现MyInterface ,你应该这样做:

public void AcceptsGeneric ( MyInterface generic_enum )

如果出于某种原因,您需要知道它实现了 MyInterface 并且它是一个枚举,您可以按如下方式声明您的方法:

public <T extends Enum<T> & MyInterface> void AcceptsGeneric ( T generic_enum )

关于java - 访问实现接口(interface)的通用枚举的父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24482592/

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