我想扩展枚举和对象(通用)

时间:2012-06-28 13:51:42

标签: java generics object enums classcastexception

Enum位于java.lang.EnumObject位于java.lang.Object。那么,为什么Enum不是Object? (我得到java.lang.ClassCastException

我想创建一个可以接受ObjectEnum的课程,就像这样......

public class MyType<T extends Enum<T>, Object> {

但这会产生编译错误。如何使我的MyType能够接受所有(或两种)类的类? (EnumObject)?

5 个答案:

答案 0 :(得分:2)

由于每个Java对象都是instanceof Object,因此没有什么比声明MyType<?>没有边界更好的了。这将捕获任何类型,包括枚举类型。

答案 1 :(得分:1)

Enum是一个对象。见http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html 所以

MyType<Object> {

应该有用。

答案 2 :(得分:0)

您可以在documentation上看到:

  

Excepting Object,没有超类,每个类都有一个和   只有一个直接超类(单继承)。在没有任何   其他显式超类,每个类都隐式地是一个子类   对象

你可以得出结论:

  1. 即使不明确,您的课程也会延伸至Object;
  2. 如果Object是一种代表其他类的计算方式,那么由于java不支持多重继承,因此无法实现。

答案 3 :(得分:0)

只需查看类对象的API,即可阅读:

Class Object is the root of the class hierarchy. Every class has Object as a superclass. 
All objects, including arrays, implement the methods of this class. 

这意味着Enum是一个对象(您可以通过查看Enum的JavaDoc来验证这一点。因此,如果您只是告诉MyType包含对象(MyType<Object>),它将接受您最初发布的对象和枚举。

虽然注意到这可能会导致不必要的行为,并且被认为是不安全的,因为所有类都是对象。

答案 4 :(得分:0)

我认为你没有正确陈述你的问题。我想您希望您的班级接受Enum Object。当你这样说时,你会发现这是唯一可能的选择。

如果您希望它接受Enum Object,则相当于说“接受Enum”。在这种情况下>是答案。