java - Java 奇怪的泛型行为
问题描述
我发现 java 泛型有一些奇怪的行为。我不能在参数化方法中使用实现另一个参数化类的参数化类。听起来很乱,所以让我们看一下代码:
class A {
public<RESP extends Serializable, REQ extends Serializable> RESP sendData(REQ req, Class<? extends I<RESP, REQ>> c) {
return null;
}
}
interface I<RESP extends Serializable, REQ extends Serializable> {
}
class B implements I<String, Integer> {
A a;
public void test() {
a.sendData(1, getClass());
}
}
它编译得很好。但是我们可以很容易地打破它。只需在 B 类中添加一个参数变量:
class B<T> implements I<String, Integer>
现在a.sendData(1, B.class);
有编译器错误:
method sendData in class A cannot be applied to given types;
required: REQ,Class<? extends I<RESP,REQ>>
found: int,Class<B>
reason: cannot infer type-variable(s) RESP,REQ
(argument mismatch; Class<B> cannot be converted to Class<? extends I<RESP,REQ>>)
where REQ,RESP are type-variables:
REQ extends Serializable declared in method <RESP,REQ>sendData(REQ,Class<? extends I<RESP,REQ>>)
RESP extends Serializable declared in method <RESP,REQ>sendData(REQ,Class<? extends I<RESP,REQ>>)
我刚刚在类签名中添加了未使用的参数!谁能解释为什么会发生这种情况,有没有办法在 B 类中使用类型变量?实际上,我的目标是像这样为 B 类签名:
class B<Data> implements I<String, ? extends List<Data>>
顺便说一句,我在 Java 8 中尝试了这段代码。
解决方案
推荐阅读
- python - 从同一文件夹打开文件但名称不同的优雅方式
- php - return $request->input() 在 laravel 上没有返回任何内容
- postgresql - 使用搜索词数组在 JSONB 列 (PostgreSQL) 中搜索时未使用 Gin 索引
- python - 来自 Keras 的 ImageDataGenerator 返回“TypeError:数据类型不理解”
- windows - 有没有办法创建一个交换文件夹名称的脚本?
- c - 在 IAR ARM V8 编译器中更改 DWARF elf 格式
- javascript - 有没有办法使用 Moment.js 格式化没有冒号 (:) 的时间
- oracle - 在 PL/SQL 包中使用 Oracle 构造函数
- amazon-dynamodb - DynamoDB 查询性能 - 唯一分区键与唯一分区+排序键
- reactjs - VSCode Prettier 没有格式化 schema.json