gpt4 book ai didi

java - Java泛型的不兼容类

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:26 25 4
gpt4 key购买 nike

看来我又被java泛型困住了。这是我所拥有的:

几个类:

class CoolIndex implements EntityIndex<CoolEntity>

class CoolEntity extends BaseEntity

使用上面的类枚举:

enum Entities {
COOL_ENTITY {
@Override
public <E extends BaseEntity, I extends EntityIndex<E>> Class<I> getIndexCls() {
return CoolIndex.class;
}

@Override
public <E extends BaseEntity> Class<E> getEntityCls() {
return CoolEntity.class;
}
}

public abstract <E extends BaseEntity, I extends EntityIndex<E>> Class<I> getIndexCls();

public abstract <E extends BaseEntity> Class<E> getEntityCls();
}

我需要使用 getIndexCls() 的结果调用的函数函数调用:

static <E extends BaseEntity, I extends EntityIndex<E>> boolean isSomeIndexViewable(Class<I> cls)

问题是编译器提示 return CoolIndex.class;return CoolEntity.class;我不清楚为什么...当然我可以将它转换为 Class<I> (第一种情况)但在我看来,我似乎在试图掩盖我的误解,但感觉不对。

最佳答案

getIndexCls 的问题是因为它是通用的,所以类型参数可以解释为任何符合声明范围的类。你可能认为 CoolIndex.class符合这些界限,确实如此,但是该方法的调用者可以提供他们自己的不兼容的类型参数,例如:

Entities.COOL_ENTITY.<UncoolEntity, UncoolIndex>getIndexCls();

这会破坏类型安全,因此编译器不允许这样做。您可以转换为 Class<I> ,但出于同样的原因,编译器会警告您未经检查的转换。它会编译,但它可能会导致运行时问题,正如我所描述的。

其他情况可以通过传递 Class<I> 来解决这种情况。对象以使类型推断正常工作,但这违背了此方法的要点——返回 Class<I>对象。

其他情况要求将泛型类型参数从方法移动到类,但您使用的是枚举,它不能是泛型。

我想出的获得类似于编译的唯一方法是删除 enum完全。使用抽象类,以便您可以声明类级类型参数。使用您想要的类型参数实例化常量。

abstract class Entities<E extends BaseEntity, I extends EntityIndex<E>> {
public static final Entities<CoolEntity, CoolIndex> COOL_ENTITY = new Entities<CoolEntity, CoolIndex>() {
@Override
public Class<CoolIndex> getIndexCls() {
return CoolIndex.class;
}

@Override
public Class<CoolEntity> getEntityCls() {
return CoolEntity.class;
}
};

// Don't instantiate outside this class!
private Entities() {}

public abstract Class<I> getIndexCls();
public abstract Class<E> getEntityCls();
}

关于java - Java泛型的不兼容类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36869121/

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