工厂和仿制药

Cra*_*ggg 7 java generics

我有以下课程:

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) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我想使用一个工厂,根据数据类型返回正确的实现.我写了以下内容,但我得到了"未经检查的演员"警告:

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;
}
Run Code Online (Sandbox Code Playgroud)

我做错了吗?我该怎么做才能摆脱警告?

rge*_*man 5

没有任何办法可以摆脱这些警告@SuppressWarnings("unchecked").

您正在传递一个Class对象,因此T可以捕获.但是您必须Class在运行时检查以确定IDataSource<T>要返回的内容.此时,类型擦除早已发生.

在编译时,Java无法确定类型安全性.它不能保证TClass运行时将是相同TIDataSource<T>返回,所以它产生的警告.

这看起来像是您被迫使用@SuppressWarnings("unchecked")删除警告来注释方法的时间之一.该警告是有原因的,因此您需要提供并确保类型安全.如上所述,看起来您提供了类型安全性.

@SuppressWarnings("unchecked")
public static <T> IDataSource<T> getDataSource(Class<T> dataType) {
Run Code Online (Sandbox Code Playgroud)


Rya*_*art 3

泛型用于编译时类型安全。它们不能用于像这样的运行时类型确定。要消除警告,您可以执行类似操作@SuppressWarnings("unchecked")或使用-Xlint:-unchecked编译器标志,如Java 教程的“原始类型”部分中所述。