[英]Incompatible types in generic return type method (Java)
从 C++ 开始接触 Java。 具有泛型返回类型的方法将无法编译。 我认为这是因为我没有为泛型方法指定类型,但我什至不知道该怎么做。 下面的代码不会编译说: error: incompatible types: AnInterface cannot be converted to I ... where I is a type-variable:
在我看来, I
确实看起来与get
的返回类型兼容,因为我明确声明I
要扩展AnInterface
。
import java.util.*;
interface AnInterface {
public int aMethod();
}
class AClass implements AnInterface {
AClass() { l = new ArrayList<>(); }
public int aMethod() { return 1; }
public void add(AnInterface x) { l.add(x); }
public AnInterface get() { return l.get(0); }
// method on() will not compile
public <I extends AnInterface> I on(int x) { I i = get(); return i; }
List<AnInterface> l;
}
class BClass implements AnInterface {
public int aMethod() { return 2; }
}
class Main
{
public static void main(String[] args)
{
AClass a = new AClass();
BClass b = new BClass();
a.add(b);
// How do I even call AClass::on()
// BClass x = a.on<BClass>(); // I expect to call on() like this
}
}
采取的方法仔细看看on
:
public <I extends AnInterface> I on() {
I i = get();
return i;
}
用I = BClass
调用它意味着get()
必须返回一个BClass
。 但是get
的签名是public AnInterface get()
,这意味着我们只知道它返回一个AnInterface
实现。 它可以是BClass
,但也可以是任何其他实现AnInterface
东西。
您可以更改on
是这样的:
public AnInterface I on() {
AnInterface i = get();
return i;
}
签名现在显示on
返回一些实现AnInterface
东西,这与我们从get
返回的类型一致。
实际上,您的示例已经清楚地说明了为什么您发布的代码无法进行类型检查。
AClass a = new AClass();
AClass b = new AClass();
a.add(b);
BClass c = a.<BClass>on();
我们期望对on
的调用返回实例b
,因为这是添加到a
的第一个元素。 但是b
是AClass
类型,而不是BClass
。 如果编译器不会拒绝该方案,我们将有一个实例AClass
可变c
型BClass
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.