Java 我想扩展枚举和对象(通用)
Java 我想扩展枚举和对象(通用),java,generics,object,enums,classcastexception,Java,Generics,Object,Enums,Classcastexception,Enum位于java.lang.Enum中,Object位于java.lang.Object中。那么,为什么Enum不是对象?(我得到了一个java.lang.ClassCastException) 我想创建一个既能接受对象又能接受枚举的类,如下所示 public class MyType<T extends Enum<T>, Object> { 公共类MyType{ 但这会导致编译错误。如何使myMyType能够接受所有(或两种)类型的类?(Enum或Object)
Enum
位于java.lang.Enum
中,Object
位于java.lang.Object
中。那么,为什么Enum
不是对象
?(我得到了一个java.lang.ClassCastException
)
我想创建一个既能接受对象
又能接受枚举
的类,如下所示
public class MyType<T extends Enum<T>, Object> {
公共类MyType{
但这会导致编译错误。如何使myMyType
能够接受所有(或两种)类型的类?(Enum
或Object
)?Enum是一个对象。请参阅
所以
MyType{
应该可以工作。枚举是一个对象。请参阅
所以
MyType{
应该可以工作。因为每个Java对象都是对象的实例,没有什么比无边界地声明
MyType
更好的了。这将捕获任何类型,包括枚举类型。因为每个Java对象都是对象的实例,所以没有什么比无边界地声明MyType
更好的了ounds。它将捕获任何类型,包括枚举类型。您可以在上看到:
除了没有超类的对象之外,每个类都有一个和一个
只有一个直接超类(单继承)。在没有任何
另一个显式超类,每个类都隐式地是
反对
你可以得出以下结论:
对象
扩展Object
是一种表示其他类的图形方式,那么您将无法使用它,因为java不支持多重继承对象
扩展Object
是一种表示其他类的图形方式,那么您将无法使用它,因为java不支持多重继承只需查看类对象的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
是一个对象(您也可以通过查看JavaDocs来验证这一点)。因此,如果您简单地告诉MyType
包含对象(MyType
),它将接受您最初发布的对象和Enum
尽管请注意,这可能会导致不必要的行为并被认为是不安全的,因为所有类都是对象。只需查看类对象的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
是一个对象(您也可以通过查看JavaDocs来验证这一点)。因此,如果您简单地告诉MyType
包含对象(MyType
),它将接受您最初发布的对象和Enum
尽管请注意,这可能会导致不必要的行为并被认为是不安全的,因为所有类都是对象。我认为您没有正确地陈述您的问题。我认为您希望您的类接受
Enum
或Object
。当您这样放置时,您可以看到这是唯一可能的选择
如果你想让它接受
Enum
和Object
,那就相当于说“接受Enum
”。在这种情况下,>就是答案。我认为你没有正确回答你的问题。我想你是想让你的类接受Enum
或Object
。当你这样说的时候,你可以看到这就是答案唯一可能的选择
如果你想让它接受
Enum
和Object
,这相当于说“接受Enum
”。在这种情况下,>就是答案。谢谢你的回答。我的第一个问题已经解决了。但是,我不能将T[]强制转换为Enum[]类型。例如,Enum ITEM{};myType=new myType();ITEM[]items=myType.getData();//getData()返回T[]。为什么不能强制转换?在控制台中:java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为[Ljtrix.manager.ItemManager$ITEM;很高兴我能帮上忙。你可能想投票和/或接受:-)编辑:我现在看到你的添加内容:因为这是一个不同的问题,我会在不同的线程中发布它!数组类型是协变的,这意味着Object[]
是任何MyType[]
的超类。换句话说,MyType[]Object[]
的instanceof Object[]是true
的,相反的显然是false
。您无法将对象[]
强制转换为任何其他数组类型。还要注意数组的类型是它的运行时属性,而不是泛型的编译时间。谢谢您的回答。我的第一个问题已经解决了。但是,我不能强制转换T[]要枚举[]type.ex,枚举项{};myType=new myType();项[]items=myType.getData();//getData()返回T[]。为什么不能强制转换?在控制台中:java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为[Ljtrix.manager.ItemManager$ITEM;很高兴我能帮上忙。你可能想投票和/或接受:-)编辑:我现在看到你的添加内容:因为这是一个不同的问题,我会在不同的线程中发布它!数组类型是协变的,这意味着Object[]
是任何MyType[]
的超类。换句话说,MyType[]Object[]
的instanceof是true
,显然,反过来是false
。您无法将对象[]
强制转换为任何其他数组类型。还要注意数组的类型是它的运行时属性,而不像泛型那样是编译时属性。