如何在以下函数中正确键入 cast:
public static <T> Dao<T> getDao(Class<T> cl){
for(Dao dao : daoList){
if (cl == dao.getParameterizedClass())
return dao;
}
return null;
}
事实上,在该行中,return dao该词dao被突出显示并出现警告Unchecked assignment: 'dao.Dao' to 'dao.Dao<T>。
这是包含此函数的类的样子:
public abstract class DaoFactory {
private static final List<Dao<?>> daoList = Arrays.asList(
new DaoImpl<>(Person.class)
);
public static <T> Dao<T> getDao(Class<T> cl){
for(Dao dao : daoList){
if (cl == dao.getParameterizedClass())
return dao;
}
return null;
}
}
这是 Dao 接口:
public interface Dao<T> {
Class<T> getParameterizedClass();
}
及其实施:
public class DaoImpl<T> implements Dao<T> {
private Class<T> parameterizedClass;
DaoImpl(Class<T> cl){
this.parameterizedClass = cl;
}
@Override
public Class<T> getParameterizedClass() {
return parameterizedClass;
}
}
当然,您可以抑制警告,或者使返回类型不参数化 - 不是Dao<T>,而只是Dao。还有其他方法可以解决警告吗?
没门。这是因为 JVM 在运行时没有关于泛型的信息,这就是为什么在这种情况下类型转换被认为是不安全的。应用程序逻辑可以这样编写,尽管有这个警告,但不会出现真正的问题。但是每种类型都有自己的实现会更正确
Dao,例如Person:通用功能(如果有的话)可以在某个抽象类中实现。
这是摆脱警告的唯一方法:
所以你告诉编译器你知道你在做什么,他没有告诉你这个方法。
通常,您的代码不是严格类型安全的。列表中的 Tk 可以存储 Dao 参数化的任何值
List<Dao<?>>。