我有以下类(class):
public interface IDataSource<T> {
public List<T> getData(int numberOfEntries);
}
public class MyDataSource implements IDataSource<MyData> {
public List<MyData> getData(int numberOfEntries) {
...
}
}
public class MyOtherDataSource implements IDataSource<MyOtherData> {
public List<MyOtherData> getData(int numberOfEntries) {
...
}
}
我想使用一个根据数据类型返回正确实现的工厂。我写了以下内容,但收到“未经检查的转换”警告:
public static <T> IDataSource<T> getDataSource(Class<T> dataType) {
if (dataType.equals(MyData.class)) {
return (IDataSource<T>) new MyDataSource();
} else if (dataType.equals(MyOtherData.class)) {
return (IDataSource<T>) new MyOtherDataSource();
}
return null;
}
我做错了吗?我该怎么做才能消除警告?
最佳答案
如果没有 @SuppressWarnings("unchecked")
,我不知道有什么方法可以消除这些警告.
您正在传递 Class
对象所以T
可以被捕获。但是你被迫检查Class
在运行时确定哪个 IDataSource<T>
回来。这时候,类型删除早已发生。
在编译时,Java 无法确保类型安全。它不能保证 T
在Class
在运行时将是相同的 T
在IDataSource<T>
返回,因此它会产生警告。
这看起来像是您被迫使用 @SuppressWarnings("unchecked")
注释方法的那些时候之一删除警告。该警告是有原因的,因此由您提供并确保类型安全。如所写,您似乎提供了类型安全。
@SuppressWarnings("unchecked")
public static <T> IDataSource<T> getDataSource(Class<T> dataType) {
关于java - 工厂和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460325/