我一直在寻找答案,但无济于事。我的问题是为什么不可能用泛型来贬低。我有一个名为Job的类,并扩展了一个名为Model
的类Job extends Model
现在,我从可重用代码中获取了一组Job,这些代码生成了一个模型列表
// 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);
这是一个简单的向下转换。
答案 0 :(得分:10)
你不能这样做,因为Java不允许这样做。 Read this.你应该这样做:
List<Job> jobs = (List<Job>) ((List<?>)jobMapper.fetchAll());
答案 1 :(得分:3)
您可以执行以下操作:
List<Job> jobs = (List) (jobMapper.fetchAll());
(如果您确信在您的情况下是安全的,请禁止警告)
编译器不允许您尝试的强制转换,因为一旦有了List&lt; Job&gt;和列表&lt; Model&gt;指向同一个列表,您可以将模型实例添加到后者,并使List&lt; Job&gt;其中有一个Model项,打破了类型安全。
因此,在允许这种技巧时要小心 - 稍后可能会以ClassCastException的形式返回给你,在那里你不会发生它。
关于你的上一个问题:请注意,虽然Job 是模型,而Job [] 是 Model [],但对于集合来说却不是这样:List&lt; Job&gt; 不是列表&lt; Model&gt;。这有点令人惊讶,但它来自我上面的解释。如果没有警告/错误,这会破坏类型安全性。
答案 2 :(得分:0)
List<Job> jobs = jobMapper.fetchAll();
错了,它永远不是明确的工作列表。
使用
List<? super Job> jobs = jobMapper.fetchAll();
代替。
答案 3 :(得分:0)
不允许这样做,因为它会/可能导致运行时错误。如果列表已包含不属于类Job
的对象<?p>,该怎么办?
你应该:
将jobMapper.fetchAll()
更改为返回List<Job>
。
投射对象而不是列表,即。 Job job = (Job) jobs.get(0)
。