- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我类的话,我会遇到以下场景 Class<? extends IModel<?>> aCls
和 Collection Collection<? extends IModel<?>> entitiesCollection
并尝试将它们传递给方法 <T extends IModel<T>> void doIndex(Class<T> clz, Iterable<T> items)
,但不断出现编译时异常。我尝试了通配符捕获和其他方法,但没有运气。我一定错过了一些明显的东西。将不胜感激任何建议。
Multimap<Class<? extends IModel<?>>, IModel<?>> entityMultimap = ArrayListMultimap.create();
for (IModel<?> entity : models) {
Class<? extends IModel<?>> aCls = entity.getClass();
entityMultimap.put(aCls, entity);
}
for (Class<? extends HasKey<?>> cls : entityMultimap.keySet()) {
Collection<? extends IModel<?>> entitiesCollection = entityMultimap.get(cls);
doIndex(cls, entitiesCollection);
}
public static <T extends IModel<T>> void doIndex(Class<T> clz, Iterable<T> items) {
.....
}
更新:有人将此标记为与其他通用通配符相关问题的重复。然而,这是非常不同的情况。我们拥有的是
public static <T extends IModel<T>> void doIndex(Class<T> clz, Iterable<T> items)
其中参数 clz 和基于相同类型 T 的项目。可以使用 wildcard capture方法,以防我们只有一个参数。但这里我们有通配符变量 cls
和entitiesCollection
:
Class<? extends HasKey<?>> cls and
Collection<? extends IModel<?>> entitiesCollection
与 clz
具有类似的关系和items
,但我不知道如何将它们传递到doIndex
。
最佳答案
一个Foo<? extends IModel<?>>
不能被视为 Foo<T extends IModel<T>>
。这是不一样的。两者中的每一个?
s 是独立的,可能指的是不同的未知事物,但两者都是T
s 指的是相同的未知事物。
如果doIndex
有两个类型参数 T
和C
格式为:<T,C extends IModel<T>>
,您可以使用 Class
来调用它参数或 Iterable
参数,但仍然不能同时两者。所以这将编译:
static <T,C extends IModel<T>> void doIndex(Class<C> clz, Iterable<C> items) {}
static {
Class<? extends IModel<?>> cls = null;
Collection<? extends IModel<?>> entitiesCollection = null;
doIndex(cls, null);
doIndex(null, entitiesCollection);
}
但是这个额外的行不会编译:
doIndex(cls, entitiesCollection);
为什么?与之前相同的问题:
cls
的
?
s 不一定是与
entitiesCollection
相同的未知事物。的
?
s。
不知道有没有好的解决办法。您也许可以调用 doIndex
如果您使用类似 <T extends IModel<T>>
的类型参数,则可以工作也在调用方法上,然后使用 T
整个代码而不是问号。
如果确实无法做到这一点(有时是这种情况),并且您必须在各处使用问号,那么在我看来,类型参数没有用,应该删除或绕过。您可能知道这一点,但即使使用原始方法声明,删除泛型的不安全转换也能完成工作:
static <T extends IModel<T>> void doIndex(Class<T> clz, Iterable<T> items) {}
static {
Class<? extends IModel<?>> cls = null;
Collection<? extends IModel<?>> entitiesCollection = null;
doIndex((Class)cls, (Collection)entitiesCollection); // has a warning, but compiles
}
或者,doIndex
的约束可以放松一下。此声明doIndex
使其在没有警告的情况下工作,因为它不再关心类型是否相同:
static void doIndex(Class<? extends IModel<?>> clz, Iterable<? extends IModel<?>> items) {}
优点也是缺点:doIndex
不能再问Class
和Iterable
彼此兼容。 (但是,如果可迭代不为空,该方法可以执行运行时检查以查看其中的对象是否与类参数兼容。)
根本问题是doIndex
要求对其参数的参数类型进行约束,但您没有满足的信息,因为所有其他类型参数都是问号。
关于java - java 中的泛型方法推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24591506/
我是一名优秀的程序员,十分优秀!