来自接口的 return 类型的通用方法

Generic method with return type from interface

我有一个接口和一个值 class 如下所示:

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

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

其他类:

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

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

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

有什么方法可以让这个 class 工作吗?

我认为这是不允许的,因为您现在将 T2 限制为 class Test<T1>.[=14= 中的 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>基本上告诉任何class"you pick what type T1 is going to be!"。这意味着在这种情况下 <T1>OtherClass<T1> 指的是同一类型,而 return 类型 T1 指的是 class 的 T1.如果重命名一个,您将看到错误:

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

如果你不能编辑ITest界面,唯一的编译方式就是强制转换,但你需要确保你确实可以在这样做之前进行转换(因为OtherClass可以return 任何类型,不一定是 T1.

的子class

编辑:编译器不允许这样做的确切原因是因为您有效地将 test 方法限制为仅接受某些类型,而它覆盖的方法允许任何类型。

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

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