返回一个给出不安全类型集合的泛型方法抛出警告

返回一个给出不安全类型集合的泛型方法抛出警告

问题描述:

当我定义一个返回Type类的方法时,我不应该能够用任何扩展Base类型的方法重写该方法吗?看看下面的例子:返回一个给出不安全类型集合的泛型方法抛出警告

MultiEntryModel.java(父类)

protected abstract <T extends Model> List<T> getDataList(); 

ProgramData.java

public class ProgramData extends MultiEntryModel { 
    ... 
     @Override 
     protected List<Program> getDataList() { 
      return programs; 
     } 
} 

Program.java

public class Program extends Model { 
    ... 
} 

我发现了一个不安全的类型在Programs.java中抛出警告,尽管我返回的是一个包含Program类型对象的List,它扩展了Mod el类,正如基类<T extends Model>中的方法签名所示。为什么?

+0

后一个完整的小例子,重现问题,用准确,完整的错误消息一起。在您发布的代码中根本没有演员。 –

+0

没有铸件。 Programs.java中的警告出现在方法被覆盖的地方。 – user1452030

protected abstract <T extends Model> List<T> getDataList(); 

这意味着列表将恢复它有成为任何T安全。例如:

List<SomeModel> someModelList = thing.getDataList(); 

如果你返回列表是一个List<Program>,这将是不安全的 - 因为你可以添加一个SomeModel进入该名单,以及/或者你可以尝试获取来自一个SomeModel名单。如果ProgramProgram的子类型/超类型,那么其中的一个操作是安全的;否则,它们都是不安全的。

不要定义的类型变量的方法 - 把它放在类:

abstract class TheClass<T extends Model> { 
    protected abstract List<T> getDataList(); 
} 

class ProgramClass extends TheClass<Program> { 
    protected List<Program> getDataList() { return programs; } 
} 
+1

非常有趣,很好的解释。谢谢! :) – user1452030

+2

调用者甚至没有绑定到'Model'的现有子类。用' List getDataList()'的签名,我甚至可以写'List list = getDataList();',期待您返回实现'ExecutorService'的'Model'子类的实例列表... – Holger