gpt4 book ai didi

java - 如何从另一个泛型类调用泛型接口(interface)方法

转载 作者:行者123 更新时间:2023-12-01 12:30:41 24 4
gpt4 key购买 nike

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

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 泛型接口(interface)的对象上的方法?

最佳答案

我认为问题在于您使用的通配符告诉编译器,该实体是任何 ClientServerComparator,不一定与 T 相关。

但是,您已经知道该实体属于 T 类型(您已通过实例化实体的类型注释定义了该类型)。另外,您正在检查实体是否是 ClientServerComparator 的实例。我假设您总是期望实体是 ClientServerComparator 的实例。如果是这种情况,那么您可以将 EntityTest 的泛型类型更改为 <T extends ClientServerComparator<T>>并摆脱instanceof检查和类型转换:

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> ,因此您可以对实体调用比较。

关于java - 如何从另一个泛型类调用泛型接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com