java - 工厂和泛型

标签 java generics

我有以下类(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 无法确保类型安全。它不能保证 TClass在运行时将是相同的 TIDataSource<T>返回,因此它会产生警告。

这看起来像是您被迫使用 @SuppressWarnings("unchecked") 注释方法的那些时候之一删除警告。该警告是有原因的,因此由您提供并确保类型安全。如所写,您似乎提供了类型安全。

@SuppressWarnings("unchecked")
public static <T> IDataSource<T> getDataSource(Class<T> dataType) {

关于java - 工厂和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460325/

相关文章:

java - 多状态规则设计策略

java - 设置更改后,Google Maps Android API v2 不显示 map

java:单词提取大写字母

typescript - 在 Typescript 中优雅地将两种类型组合成一个接口(interface)

java - 我可以有一个包含 A 或 List<A> 的类型安全映射吗?

java - 如何迭代并获取动态传递的类的值

java - 如何在 spring config 中手动连接 hibernate session 工厂

java - Android 抽屉导航从服务器获取数据

delphi - 如何使用 Delphi 一步初始化 TList<T>?

java - Java 泛型中的桥接方法。这个例子正确吗?