Java 泛型接口方法实现疑惑,求各位大佬解答

2023-10-25 16:47:01 +08:00
 nealHuang

接口 IHuman.java

public interface IHuman<K, V> {
    V execute(K request) throws Exception;
}

实现 MaleHuman.java

public class MaleHuman implements IHuman<String, String> {
    @Override
    public String execute(String request) throws Exception {
        return ...;
    }
}

按照以上接口内的泛型方法,能进行子类实现也不会报错。但是接口内的泛型方法换种写法,就不知道如何写实现了。

接口 IHuman.java (改)

public interface IHuman {
    <K, V> V execute(K request) throws Exception;
}

请问按上述接口内的泛型方法,如何类似泛型类的实现那样,写 MaleHuman.java 这个实现类。

1241 次点击
所在节点    Java
8 条回复
gaifanking
2023-10-25 16:58:15 +08:00
idea 自动生成代码如下:
@Override
public <K, V> V execute(K request) throws Exception {
return null;
}

这种是方法泛型,仅该方法可用,没看懂你的目的是啥。
AoEiuV020JP
2023-10-25 17:08:17 +08:00
后一个 IHuman 这种写法是限制运行时 K 和 V 具体类型的,
而前面代码可以保证 MaleHuman 中的 K 和 V 都是 String ,这是本质区别,无法翻译代码的,
AoEiuV020JP
2023-10-25 17:10:11 +08:00
@AoEiuV020JP #2 后一个 IHuman 这种写法是不能限制运行时 K 和 V 具体类型的,
xianyv
2023-10-25 17:11:07 +08:00
可以这样

```java
interface HumanExtend extends IHuman {

@Override
<K extends String, V extends String> V execute(K request) throws Exception;
}

class HumanImpl implements HumanExtend{
@Override
public <K extends String, V extends String> V execute(K request) throws Exception {
return null;
}
}
class HumanImplTwo implements HumanExtend{

@Override
public String execute(String request) throws Exception {
return null;
}
}

```
levintrueno
2023-10-25 17:20:47 +08:00
第一个是泛型接口 + 普通方法。第二个是普通接口 + 泛型方法。应该去了解泛型类和泛型方法的区别。
nealHuang
2023-10-25 17:36:29 +08:00
@gaifanking 是为了在 MaleHuman 中把两个泛型都限制为 String ,如果也都是泛型,那就胡乱传了
yidinghe
2023-10-25 23:10:33 +08:00
<K, V> 这样的泛型参数,如果是在 class 级别定义,就表示这两个类型在整个类中有效,每个方法都可以定义这两个类型的变量或参数。

如果 <K, V> 是在某个方法上定义,就像你 IHuman.java (改) 的例子,那么这两个类型就只能在这个方法内使用,这个类的其他方法则无法使用。

```java
// 实现类
public class HumanImpl implements IHuman {

@Override
public <K, V> V execute(K request) throws Exception {
// 这个方法里面可以使用 K ,V 类型的变量
return (V) request;
}

// 使用例子
public static void main(String[] args) {
var result = new HumanImpl().<String, String>execute("haha"); // 返回 "haha"
}
}
```
gaifanking
2023-10-26 10:01:45 +08:00
@nealHuang 那就是 4 楼老哥 @xianyv 的办法:
方法泛型中使用 extends 关键字:<K extends String, V extends String> V execute(K request), 限定 K V 类型
extends super 关键字也可以加在类泛型上,注意 PECS 原则。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/985336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX