9

我一直在为此寻找答案,但无济于事。我的问题是为什么不可能对泛型感到沮丧。我有一个名为 Job 的类并扩展了一个名为 Model 的类

Job extends Model

现在我从生成模型列表的可重用代码中获取作业集合

// error: Cannot cast from List<Model> to List<Job>
List<Job> jobs = (List<Job>) jobMapper.fetchAll();

其中 jobMapper.fetchAll() 返回一个 List ,其中每个模型都是一个 Job 对象。

我认为这会起作用,因为我可以这样做:

EditText mUsername = (EditText) findViewById(R.id.editUserName);

这是一个简单的向下转换。

4

4 回答 4

12

你不能这样做,因为 Java 不允许这样做。读这个。你应该做的伎俩:

 List<Job> jobs = (List<Job>) ((List<?>)jobMapper.fetchAll());
于 2013-03-15T08:25:46.143 回答
3

您可以执行以下操作:

List<Job> jobs = (List) (jobMapper.fetchAll());

(如果您确信它在您的情况下是安全的,请取消警告)

编译器不允许您尝试进行强制转换,因为一旦您有一个 List<Job> 和一个 List<Model> 指向同一个列表,您可以将 Model 实例添加到后者,并使 List<Job> 有一个 Model项目,这破坏了类型安全。

因此,在允许这种技巧时要小心——它稍后会以 ClassCastException 的形式返回给您,而您不希望它发生。

关于您的最后一个问题:请注意,虽然 JobModel 而 Job[]Model[],但集合并非如此:List<Job>不是List<Model>。这有点令人惊讶,但它遵循我上面的解释。在没有警告/错误的情况下允许这种转换会破坏类型安全。

于 2013-03-15T08:31:43.827 回答
0
List<Job> jobs = jobMapper.fetchAll();

错了,它永远不是明确的工作列表。

利用

List<? super Job> jobs = jobMapper.fetchAll();

反而。

于 2013-03-15T08:38:36.753 回答
0

不允许这样做,因为它会/可能导致运行时错误。如果列表已经包含不属于类的对象Job怎么办?

您应该:

  1. jobMapper.fetchAll()List<Job>

  2. 投射对象而不是列表,即。Job job = (Job) jobs.get(0).

于 2013-03-15T08:40:55.637 回答