Java 基类和接口具有相同函数且返回类型不同的多重继承

Java 基类和接口具有相同函数且返回类型不同的多重继承,java,inheritance,extends,implements,Java,Inheritance,Extends,Implements,我已经编写了一个类,它是类a的基类,并实现了类B的接口 现在,我的编译器给出了一个wierd类型的错误,即“类a中函数的返回类型与类B中函数的返回类型不兼容。” 我的代码如下: public class X extends A implements B { } public class A { public Enumeration<String> test(){} } public interface B { public Enumeration<Object>

我已经编写了一个类,它是类a的基类,并实现了类B的接口

现在,我的编译器给出了一个wierd类型的错误,即“类a中函数的返回类型与类B中函数的返回类型不兼容。”

我的代码如下:

public class X extends A implements B
{
}

public class A
{
  public Enumeration<String> test(){}
}

public interface B
{
  public Enumeration<Object> test();
}
公共类X扩展了A和B
{
}
公共A类
{
公共枚举测试(){}
}
公共接口B
{
公共枚举测试();
}

现在我不明白为什么编译器会给出这样的错误,因为字符串已经是对象的一种类型,所以我理解的是,自动类型转换应该在运行时发生,因为这一点。我说得对吗?或者我对概念的理解对我来说太难了?

String
对象
的子类,但
枚举
不是
枚举
的子类。如果是,那么我可以将
枚举
转换为
枚举
,然后将其转换为
枚举
,所有这些都没有警告;但是当我尝试将它用作
枚举时,我得到了
ClassCastException
s


请注意,Java数组的行为与我上面描述的一样,这被广泛认为是该语言设计中的一个重大缺陷。

String
对象的子类
,但
枚举
不是
枚举
的子类。如果是,那么我可以将
枚举
转换为
枚举
,然后将其转换为
枚举
,所有这些都没有警告;但是当我尝试将它用作
枚举时,我得到了
ClassCastException
s


请注意,Java数组的行为与我上面描述的一样,这被广泛认为是该语言设计中的一个重大缺陷。

如果您可以更改接口的定义,您可以扩展它并获得所需的内容。返回类型将是
Enumeration,如果您可以更改接口的定义,则可以扩展接口并获得所需的内容。返回类型应该是
Enumeration,您尝试在Java中执行的操作是可能的。正如Ernest所说,枚举不是枚举的子类,因为Java genercis缺少方差的概念

无论如何,您可以使用类型通配符来表达您的意图。您必须以这种方式更改界面:

public interface B
{
  public Enumeration<?> test();
}
公共接口B
{
公共枚举测试();
}
现在您的代码可以编译了。为了让您知道,您还可以将接口限制为对象以外的其他类型。例如,如果您必须构建一个返回枚举的接口
数目:

    class X extends A implements B
    {
    }

    class A
    {
        public Enumeration<Long> test(){return null;}
    }

    class C
    {
        public Enumeration<String> test(){return null;}
    }

    //This doesn't compile! String does not extend Number
    /*class Y extends C implements B
    {
    }*/

    interface B
    {
        public Enumeration<? extends Number> test();
    }
类X扩展了A和B
{
}
甲级
{
公共枚举测试(){return null;}
}
C类
{
公共枚举测试(){return null;}
}
//这不能编译!字符串不扩展数字
/*类Y扩展C实现B
{
}*/
接口B
{

公共枚举您尝试在Java中执行的操作是可能的。正如Ernest所述,枚举不是枚举的子类,因为Java genercis缺少方差的概念

无论如何,您可以使用类型通配符来表达您的意图。您必须通过以下方式更改接口:

public interface B
{
  public Enumeration<?> test();
}
公共接口B
{
公共枚举测试();
}
现在,您的代码可以编译了。为了让您知道,您还可以将接口限制为对象以外的其他类型。例如,如果您必须构建一个返回枚举的接口
数目:

    class X extends A implements B
    {
    }

    class A
    {
        public Enumeration<Long> test(){return null;}
    }

    class C
    {
        public Enumeration<String> test(){return null;}
    }

    //This doesn't compile! String does not extend Number
    /*class Y extends C implements B
    {
    }*/

    interface B
    {
        public Enumeration<? extends Number> test();
    }
类X扩展了A和B
{
}
甲级
{
公共枚举测试(){return null;}
}
C类
{
公共枚举测试(){return null;}
}
//这无法编译!字符串不扩展数字
/*类Y扩展C实现B
{
}*/
接口B
{

公共枚举可能重复的可能重复的可能重复的感谢有价值的回复,能够解决问题。感谢有价值的回复,能够解决问题。不建议使用原始类型,因为您是类型安全的,请参阅我的答案以获得更好的方法…谢谢。我完全同意。我只是在for方面遇到了问题matting。我希望preview能在移动网站上工作。编辑了我的答案以符合我的初衷。啊,事实上,枚举后有一个strage\是的。这是我第一次尝试在没有预览的情况下修复它。不建议使用原始类型,你是类型安全的,请查看我的答案以获得更好的方式…谢谢。我绝对同意。我同意st的格式有问题。我希望preview能在移动网站上运行。编辑我的答案以符合我的原始意图。啊,事实上,枚举后有一个错误。是的。这是我第一次尝试在没有预览的情况下修复它。我们的答案类似,但Andrea的答案更详细。@John,谢谢你的学分;我已经发布了d作为答案,只是因为在你的答案的第一版中,你确实忘记了“我们的答案相似,但安德里亚的答案更详细。@约翰,谢谢你的学分;我作为答案发布,只是因为在你的答案的第一版中,你确实忘记了”