我编写了一个类,它是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已经是一种对象,所以我理解的是自动类型转换应该在运行时发生。我对吗?或者我的概念理解对我来说很奇怪?
答案 0 :(得分:2)
如果您可以更改界面的定义,则可以扩展界面并获得所需内容。返回类型为Enumeration<? extends Object>
答案 1 :(得分:1)
String
是Object
的子类,但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();
}