ClientServerComparator

ClientServerComparator

这是我的代码。
我有一个通用的界面

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/

10-09 04:42