作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
看来我又被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/
我是一名优秀的程序员,十分优秀!