繁体   English   中英

泛型返回类型方法中的不兼容类型 (Java)

[英]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的第一个元素。 但是bAClass类型,而不是BClass 如果编译器不会拒绝该方案,我们将有一个实例AClass可变cBClass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM