基类和接口的多重继承具有相同的功能和不同的返回类型

时间:2012-05-29 11:46:35

标签: java inheritance extends implements

我编写了一个类,它是A类的基类,并实现了B类接口。

现在我的编译器发出了一个错误的错误,说“A类函数的返回类型与B类函数的返回类型不兼容。”

我的代码如下,

public class X extends A implements B
{
}

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

public interface B
{
  public Enumeration<Object> test();
}

现在我无法理解为什么编译器会发出这样的错误,因为String已经是一种对象,所以我理解的是自动类型转换应该在运行时发生。我对吗?或者我的概念理解对我来说很奇怪?

3 个答案:

答案 0 :(得分:2)

如果您可以更改界面的定义,则可以扩展界面并获得所需内容。返回类型为Enumeration<? extends Object>

答案 1 :(得分:1)

StringObject的子类,但Enumeration<String> 不是 Enumeration<Object>的子类。如果是,那么我可以将Enumeration<String>投射到Enumeration<Object>,然后将其投射到Enumeration<Integer>,所有这些都没有警告;但当我尝试将其用作Enumeration<Integer>时,我会得到ClassCastException s。

请注意,Java数组的行为如上所述,这被广泛认为是语言设计中的一个重大缺陷。

答案 2 :(得分:1)

您在Java中尝试做的事情是可能的。正如欧内斯特所说,枚举不是枚举的子类,因为Java genercis缺乏 variance 的概念。

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

public interface B
{
  public Enumeration<?> test();
}

现在你的代码编译得很好。只是为了让您知道,您还可以将界面限制为除Object之外的其他类型。例如,如果您必须构建一个返回Enumerations的接口 数量:

    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();
    }