这是我的代码。
我有一个通用的界面
public interface ClientServerComparator<T> {
public boolean compare(T entity,T obj);
}
我正在尝试实现另一个通用类
public class EntityTest<T> {
public void testPutObject(Client client, T obj ) throws UnExpectedStatusException
{
log.debug("PUT: " + location);
T entity = testGetObject(client,entityLocation,l);
if(entity instanceof ClientServerComparator<?> )
{
if( false == ((ClientServerComparator<?>) entity).compare(entity,obj) )
{
log.error("Object fetched back does not match object put");
throw new UnExpectedStatusException();
}
}
}
我收到以下编译器错误:
The method compare(capture#1-of ?, capture#1-of ?) in the type
ClientServerComparator<capture#1-of ?> is not applicable for the arguments (T, T)
如何使
EntityTest
通用类在实现ClientServerComparator
通用接口的对象上调用方法? 最佳答案
我认为问题在于您使用的通配符告诉编译器,该实体是任何ClientServerComparator,不一定与T相关。
但是,您已经知道实体的类型为T(已在实例化实体的类型注释中定义了T)。另外,您正在检查实体是否是ClientServerComparator的实例。我假设您始终希望实体是ClientServerComparator的实例。如果是这种情况,则可以将EntityTest的通用类型更改为<T extends ClientServerComparator<T>>
并摆脱instanceof check和类型强制转换:
public class EntityTest<T extends ClientServerComparator<T>> {
public void testPutObject(Client client, T obj) {
T entity = testGetObject(client);
if (entity.compare(entity, obj)) {
throw new UnExpectedStatusException();
}
}
}
现在T是
ClientServerComparator<T>
,因此您可以在实体上调用compare。关于java - 如何从另一个泛型类调用泛型接口(interface)方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25943858/