0

我编写了一个类,它是 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 已经是对象的一种类型,所以我的理解是自动类型转换应该因此在运行时发生。我对吗?或者我的概念理解对我来说很奇怪?

4

3 回答 3

2

如果你能改变接口的定义,你就可以把它拓宽,得到你想要的。返回类型将是Enumeration<? extends Object>

于 2012-05-29T11:56:49.083 回答
1

String是 的子类Object,但Enumeration<String>不是子类Enumeration<Object>。如果是,那么我可以将 anEnumeration<String>转换为 an Enumeration<Object>,然后将其转换为 an Enumeration<Integer>,所有这些都没有警告;但是当我尝试将它用作 时Enumeration<Integer>,我会得到ClassCastExceptions。

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

于 2012-05-29T11:49:11.880 回答
1

您尝试做的事情在 Java 中是可能的。正如 Ernest 所说,Enumeration 不是 Enumeration 的子类,因为 Java 泛型缺少方差的概念。

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

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

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

    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();
    }
于 2012-05-29T11:59:12.437 回答