gpt4 book ai didi

java - 如何在接口(interface)方法中使用泛型类型参数

转载 作者:行者123 更新时间:2023-12-02 00:56:27 25 4
gpt4 key购买 nike

我创建了一个界面:

public interface Person {
<T extends Food> void eat(T food);
}

哪里Food是具体但非最终的 class

我想实现一个人的 eat子类为 Food 的方法,即Fruit ,像这样:

public class Man implements Person {
@Override
public void eat(Fruit food) {
//implementation here
}
}

但是出现编译错误

问题:为什么会出现编译错误?如何在不向接口(interface)添加泛型类型的情况下修复错误,如 public interface Person<T>

最佳答案

你不能用泛型来做到这一点。

想象一下您编写的代码已编译。那么这样做就没有意义了

Person person = new Man();
person.eat(new Steak()); //where Steak is a subclass of Food

现在应该调用什么方法? Person只定义了一个方法eatFruit参数。

泛型提供编译时类型安全性,因此它们在编译期间是显式的。这称为删除过程。编译器将删除所有类型参数,并在必要时添加一些强制转换。

此方法定义于 Person

<T extends Food> void eat(T food);

编译后会变成

void eat(Food food);

因此,如果您按照您的方式实现 Man,则 Person 中将有两个名为 eat 的方法,它们具有不同的参数,因此它们是不同的方法。

void eat(Food food);
void eat(Fruit food);

实现此目的的一种方法是将泛型移至类级别,如下所示

public interface Person<T extends Food> {
void eat(T food);
}

//We enforce the Man class to only "eat" Fruit foods.
public class Man implements Person<Fruit> {
public void eat(Fruit fruit) {
//Eat some fruit
}
}

//This will work and compile just fine
Person<Fruit> person = new Man();
Fruit fruit = new Fruit();
person.eat(fruit);

但这不会编译。

Person<Fruit> person = new Man();
Food food = new Fruit();
person.eat(food); //food must be casted to Fruit

因为当你声明person<Fruit>指示编译器检查您是否有效地传递了 Fruit实例。它在编译时知道您正在传递父类(super class)型 Food而不是Fruit如果代码在此状态下编译,可能会导致运行时抛出异常,从而破坏类型安全,而这正是泛型的意义所在。事实上

public class Man implements Person<Fruit> {
public void eat(Fruit fruit) {
System.out.println(fruit.toString());
}
}

将这样编译

public class Man implements Person {
public void eat(Food fruit) {
//The compiler will automatically add the type cast!
System.out.println(((Fruit) fruit).toString());
}
}

绕过编译器类型安全检查的一种方法是省略像这样的泛型

//This will compile with a warning
//Unchecked use of 'eat(T)' method
((Person)person).eat(food);

关于java - 如何在接口(interface)方法中使用泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61312774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com