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{
但这会导致编译错误。如何使my
MyType
能够接受所有(或两种)类型的类?(
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
    。您无法将
    对象[]
    强制转换为任何其他数组类型。还要注意数组的类型是它的运行时属性,而不像泛型那样是编译时属性。