[英]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
的子类型并且只返回它获得的客户端实例时,我会遇到编译错误。 我想要的是统一T1
和T2
:
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.