好的,我目前正在定义泛型枚举参数如下:
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>
不允许我直接访问MyInterface
方法,以及2)直接访问Enum方法(比如.values()
)。
强制转换适用于访问MyInterface
方法,但在我看来,它违背了指定泛型类型扩展MyInterface
的目的,因为用Enum<?>
替换Enum<? extends MyInterface>
并将对象转换为(MyInterface)
仍然是合法的。
如果我误解了泛型的使用和extends
的实现,可以有人向我解释如何正确地明确指定给定接口的泛型实现。
发布于 2014-06-29 20:00:39
您无法访问values()
,因为它不是实例方法;它是属于枚举类型的静态方法。因此,传递超类Enum
的实例不会给您提供所需的信息。
就接口方法而言,声明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 )
发布于 2014-06-29 20:23:13
将方法的参数声明为Enum<? extends MyInterface> generic_enum
限制了generic_enum
的方法,无需强制转换就可以访问Enum
的方法。类型参数不会将类型更改为Enum
以外的其他类型。因此,这些行是无效的:
generic_enum.values();
generic_enum.GetValue();
((Enum<?>)generic_enum).values(); // ((Enum<?>)generic_enum) still of type Enum
现在让我们来看看下面的一行:
((MyInterface)generic_enum).GetValue();
我们没有理由不允许演员。扩展Enum
的类可以实现MyInterface
。因此,没有理由不允许这种做法。(编译器不允许这样做,仅仅因为ClassCastException
可能在运行时发生)。
现在剩下的一行:
generic_enum.getDeclaringClass().getEnumConstants();
因为generic_enum
的类型是Enum<? extends MyInterface>
,所以generic_enum.getDeclaringClass()
的返回类型是Class<? extends MyInterface>
。由于Class
包含一个方法getEnumConstants()
,所以行是有效的。
由于仍然可以访问generic_enum
类中的值,所以可以将AcceptsGeneric
声明为
public void AcceptsGeneric(MyInterface generic_enum)
或
public<T extends Enum<T> & MyInterface> void AcceptsGeneric(T generic_enum)
并使用
generic_enum.getClass().getEnumConstants()
才能得到价值。
https://stackoverflow.com/questions/24482592
复制相似问题