java - 泛型参数化类型返回生成警告或错误
问题描述
在下面的示例代码中,我试图返回,但至少我得到了一个警告。其他情况(2 和 3)会导致错误。是否有正确的返回方法不会导致警告?
static class Cars<C extends Car> {
private C c;
Cars(C c) {
this.c = c;
}
}
static class Car { }
static <C extends Car> Cars<C> cars() {
// 1. WARNING: 'Raw use of parameterized class 'Cars''
// return new Cars(new Car());
// 2. ERROR: 'Cannot infer arguments'
// return new Cars<>(new Car());
// 3. ERROR: 'Required C provided Car'
// return new Cars<C>(new Car());
}
解决方案
我认为您在这里滥用或至少误解了泛型。理解泛型参数是由调用者而不是被调用者决定的,这一点非常重要。
从您的cars
方法的实现来看,您似乎想要返回一个Cars<Car>
对象,但您的方法签名却另有说明。你的方法签名说
此方法可以返回
Cars<C>
whereC
isCar
或 的任何子类Car
,而您(调用者)可以决定是什么C
。
你的方法没有做到这一点,是吗?如果我写了一个Car
被调用的子类Lorry
,你的方法可以给我一个Cars<Lorry>
吗?没有。
(在你说之前,不,aCars<Lorry>
不是“一种” 。如果你不明白为什么,Cars<Car>
请看这里。)
因此,您需要将签名更改为更“谦虚”的签名:)(没有通用参数)
static Cars<Car> cars()
并使用这一行作为返回语句:
return new Cars<>(new Car());
推荐阅读
- c# - C# 中的“温度”属性
- fish - Fish 在 config.fish 中运行缩写
- node.js - 连接到数据库时出现 DotEnv 错误
- json - 我每次都必须使用 ctrl+s 来更新 UI 。Setstate() 不工作。在哪里正确使用 setstate()?
- qt - 什么时候使用 layer.enabled 是个好主意?
- opencv - 每当我构建 opencv-python 时,opencv_python.libs 文件夹都会丢失
- xml - 如何在odoo的标题中移动字段状态'
- python - Python,Pandas:将特定值插入空单元格(按列)
- python-3.x - cx_Oracle ORA-00933 SQL 命令未正确结束
- nestjs - 如何改进动态查询