繁体   English   中英

从接口返回类型的通用方法

[英]Generic method with return type from interface

我有一个接口和一个看起来像这样的值类:

public interface ITest<T1> {
  <T2> T1 test(OtherClass<T2> client);
}

基本上,它表示子类型必须实现返回T1的方法test ,无论实现子类型中是什么。

OtherClass:

public class OtherClass<T> {
  public T contents;  
}

但是,当我想编写一个实现test的子类型并且只返回它获得的客户端实例时,我会遇到编译错误。 我想要的是统一T1T2

public class Test<T1> implements ITest<T1> {
  @Override
  public <T1> T1 test(OtherClass<T1> client) { // compile error
    return client.contents;
  }
}

有没有办法让这个班上班?

我不认为认为这是允许的,因为你现在限制T2是一个T1类中的Test<T1>

您可以按如下方式解决此问题:

public interface ITest<T1, T2> {
    T1 test(OtherClass<T2> client);
}

public class OtherClass<T> {
  public T contents;  
}

public class Test<T1> implements ITest<T1, T1> {
    @Override
    public T1 test(OtherClass<T1> client) {
        return client.contents;
    }
}

<T1>基本上告诉任何一个班级“你选择T1将是什么类型!”。 这意味着在这种情况下, <T1>OtherClass<T1>指的是相同的类型,而返回类型T1指的是类的T1 如果重命名,您将看到错误:

@Override
public <OtherClassType> T1 test(OtherClass<OtherClassType> client) {
    return client.contents; //you can't do that without casting OtherClassType to T1
}

如果你不能编辑ITest接口,那么编译它的唯一方法就是通过强制转换,但你需要确保在执行之前可以实际执行(因为OtherClass可以返回任何类型,不一定是T1的子类)。

编辑:编译器不允许这样做的确切原因是因为您实际上限制了test方法只接受某些类型,而它重写的方法允许任何类型。

在您的接口声明中,您说您希望test函数接受任何类型(您没有为T2指定任何边界)。

在您的实现中,您只接受T1 ,这不是任何类型。

暂无
暂无

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

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