首页 > 解决方案 > 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 中尝试了这段代码。

标签: javagenerics

解决方案


推荐阅读