首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >访问实现接口的泛型枚举的父方法

访问实现接口的泛型枚举的父方法
EN

Stack Overflow用户
提问于 2014-06-29 19:29:36
回答 2查看 294关注 0票数 1

好的,我目前正在定义泛型枚举参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的实现,可以有人向我解释如何正确地明确指定给定接口的泛型实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-29 20:00:39

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

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

如果您想声明generic_enum实现了MyInterface,那么您应该准确地这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void AcceptsGeneric ( MyInterface generic_enum )

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T extends Enum<T> & MyInterface> void AcceptsGeneric ( T generic_enum )
票数 2
EN

Stack Overflow用户

发布于 2014-06-29 20:23:13

将方法的参数声明为Enum<? extends MyInterface> generic_enum限制了generic_enum的方法,无需强制转换就可以访问Enum的方法。类型参数不会将类型更改为Enum以外的其他类型。因此,这些行是无效的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
generic_enum.values();
generic_enum.GetValue();
((Enum<?>)generic_enum).values(); // ((Enum<?>)generic_enum) still of type Enum

现在让我们来看看下面的一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
((MyInterface)generic_enum).GetValue();

我们没有理由不允许演员。扩展Enum的类可以实现MyInterface。因此,没有理由不允许这种做法。(编译器不允许这样做,仅仅因为ClassCastException可能在运行时发生)。

现在剩下的一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
generic_enum.getDeclaringClass().getEnumConstants();

因为generic_enum的类型是Enum<? extends MyInterface>,所以generic_enum.getDeclaringClass()的返回类型是Class<? extends MyInterface>。由于Class包含一个方法getEnumConstants(),所以行是有效的。

由于仍然可以访问generic_enum类中的值,所以可以将AcceptsGeneric声明为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void AcceptsGeneric(MyInterface generic_enum)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public<T extends Enum<T> & MyInterface> void AcceptsGeneric(T generic_enum)

并使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
generic_enum.getClass().getEnumConstants()

才能得到价值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24482592

复制
相关文章
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
3.8K0
Dart中的泛型方法、泛型类、泛型接口
Java泛型基础(二)泛型接口泛型方法# 总结
泛型可以应用于同一个类,该类可以针对多种类型使用,例如构建一个RedisTemplateService组件,用于处理当前应用中所有对象的缓存操作。这篇文章主要介绍泛型应用于接口、方法和匿名内部类的一些知识点和使用案例,也包括《Java编程思想》中对应的练习题的解读。
阿杜
2018/08/06
3.3K0
Java——泛型基本总结(通配符、泛型接口、泛型方法)
假如,现在定义一个表示坐标的类,Point,属性坐标x,y,但是此类设计特殊,现在由于设计特殊,现在实际使用中有可能出现以下三种结构的数据:
Winter_world
2020/09/25
3.4K1
Java——泛型基本总结(通配符、泛型接口、泛型方法)
Java 泛型示例 - 泛型方法,类,接口
如果您一直在使用Java Collections并使用版本 5 或更高版本,那么我确定您已经使用过它。
淡定的蜗牛
2019/10/25
2.6K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.5K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
15.6K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
Java 继承泛型类和实现泛型接口
泛型也可以继承和实现接口 public class Test{ public static void main(String[] args) { } } class Father<T>{ } interface ARB<E>{ } class child<T,E> extends Father<T> implements ARB<E>{ } 泛型继承的四种情况 全部继承 子类泛型可以比父类多 public class Test{ public static void m
用户2965768
2019/03/08
6.8K0
Java 继承泛型类和实现泛型接口
C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。
zls365
2020/08/19
4.2K0
泛型接口,泛型类和泛型通配符
泛型的使用位置,除了最常见的约束集合元素,还可以使用在接口,类,方法上面。最本质的原因就是为了在使用接口,类,方法的时候,可以将类型作为参数,进行类型的参数传递。这样可以使程序的编写更加的灵活,在创建对象,调用方法的时候动态的指定类型,所以泛型也可以理解为类型的参数化。
用户5745563
2019/07/04
2.4K0
泛型接口,泛型类和泛型通配符
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.4K0
Java泛型接口的使用
在上面的示例中,IX2MqToThirdBaseBiz<S, T>接口被实现为MyX2MqToThirdBaseBiz类,并且指定了S类型为String,T类型为Integer。这样,在实现类中的sendMessage方法就接受String类型的参数,而receiveMessage方法返回Integer类型的值。
高久峰
2023/09/08
2420
Stack集合与枚举、泛型
Stack是堆栈结构的集合,Stack集合是继承于Vector集合的子类,这个集合的特点是后进先出的堆栈结构。Stack提供5个额外的方法使得Vector得以被当做堆栈使用。基本的方法有push和pop方法,还有peek得到栈顶的元素,empty方法是测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚刚创建的时候是空栈。
端碗吹水
2020/09/23
4900
Stack集合与枚举、泛型
Golang 使用接口实现泛型
在C/C++中我们可以使用泛型的方法使代码得以重复使用,最常见例如stl functions:vectorvint or vectorvfloat等。这篇文章将使用interface{…}接口使Golang实现泛型。
李海彬
2019/05/08
2K0
Golang 使用接口实现泛型
泛型类、泛型方法、类型通配符的使用
       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泰斗贤若如
2019/06/19
3.8K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.6K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点。对于一些之前很模糊的概念,渐渐的清晰起来。 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化。接口仅仅是描述一种方法的规约,即只能通过某几个方法来操作对象,它把内部的实现隐藏到实现类中,自己仅仅关注使用而已。 参数 抽象类 接口 默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现 实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽
用户1154259
2018/01/17
7880
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.2K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型方法
上一篇章我们出于类型安全的考虑,不建议使用原生类型,用List<?>代替使用,但是List<?>不允许添加除null以外的任何元素,因此我们需要使用泛型方法List<E>,如下: import jav
java达人
2018/01/31
1.3K0
泛型擦除是什么意思_泛型类和泛型方法的区别
在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但为了与老的Java代码保持一致,也允许在使用带泛型声明的类时不指定实际的类型。如果没有为这个泛型类指定实际的类型,此时被称作raw type(原始类型),默认是声明该泛型形参时指定的第一个上限类型。
全栈程序员站长
2022/09/27
1.3K0
泛型方法
泛型方法 http://msdn2.microsoft.com/zh-cn/library/twcad0zb.... Service Locator with Generic Methods 泛型的Foxcop设计规则 Avoid excessive parameters on generic types Collections should implement generic interface Do not declare static members on generic types Do no
张善友
2018/01/22
7170

相似问题

父非泛型接口方法的泛型接口隐藏

30

用泛型方法实现泛型接口

10

获取实现接口的泛型枚举的值。

20

扩展枚举泛型的泛型接口

14

扩展枚举泛型的泛型接口

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文