来自接口的 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 它获得的客户端实例时,我遇到了编译错误。我想要的是统一 T1
和 T2
:
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
,这不是任何类型。
我有一个接口和一个值 class 如下所示:
public interface ITest<T1> {
<T2> T1 test(OtherClass<T2> client);
}
基本上,它说子类型必须实现 test
方法 returns T1,无论实现子类型中的是什么。
其他类:
public class OtherClass<T> {
public T contents;
}
但是,当我想编写一个实现 test
的子类型并且只是 returns 它获得的客户端实例时,我遇到了编译错误。我想要的是统一 T1
和 T2
:
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.
编辑:编译器不允许这样做的确切原因是因为您有效地将 test
方法限制为仅接受某些类型,而它覆盖的方法允许任何类型。
在您的接口声明中,您说您希望 test
函数接受任何类型(您没有为 T2
指定任何边界)。
在您的实现中,您只接受 T1
,这不是任何类型。