我有三个类,它们有一个同名的函数。在另一个类中,我想把类作为输入并使用那个函数,但我不知道怎么做。例如:
public interface Apple {
String showSpecifications(){
// some calculations
}
}
public interface Orange {
String showSpecifications(){
// some calculations
}
}
public interface Kiwi {
String showSpecifications(){
// some calculations
}
}
在我的第四节课中,我想要一个这样的函数:
public String showObjSpec(Object fruit) {
fruit.showSpecifications();
}
问题是我不知道如何定义showObjSpec输入类型以能够接受Apple, Orange和Kiwi对象。目前,很明显,我得到一个错误,说类对象不支持showSpecifications()函数。
接口可以相互扩展,您可以添加一个公共接口Fruit
来将它们组合在一起。
示例接口:
public interface Fruit {
String showSpecifications();
}
每个水果都需要添加extends Fruit
,然后showObjSpec
可以只接受Fruit
对象作为参数。
public interface Apple extends Fruit {
default String showSpecifications(){
// some calculations
}
}
public interface Orange extends Fruit {
default String showSpecifications(){
// some calculations
}
}
public interface Kiwi extends Fruit {
default String showSpecifications(){
// some calculations
}
}
Java是严格基于类型的;它没有任何功能来引用"我接受任何类型,只要它有showSpcifications
方法"的想法。
因此,你. .打个字!
public interface Specified {
// NB: 'showSpecifications' is a bad name;
// it suggests calling that method shows specs.
// it doesn't - it returns them. hence, getSpecifications is better.
String getSpecifications();
}
然后让每个类型实现该接口:
public class Kiwi {
@Override public String getSpecifications() {
// some calculations
}
}
现在你可以编写一个方法,它接受任何实现this的东西:
public void showObjSpec(Specified s) {
System.out.println(s.getSpecifications());
}
根据你的新界面实际描述的行为,也许"Fruit"会是一个更好的名字。
如果java确实"只接受任何带有x方法的东西",你可以说:"任何带有shoot(Person p)
方法的东西",然后给出:
class Camera {
void shoot(Person p) { ... }
}
class Gun {
void shoot(Person p) { ... }
}
非常,非常坏的事情发生了。类型是有名称空间的(它们获得用于避免冲突的包描述),但方法名没有。因此,Java不允许您创建让您引用"带有x方法的任何东西"的类型式结构。有些语言会这样做(这被称为"结构类型")。Java不是那种让你无意中杀死你的朋友的语言,而你想做的只是制作一张图片。
你应该在你的代码中实现继承,以便所有子类从超类中获得方法名。你的代码应该是这样的:
public interface Fruit {
String showSpecifications()
}
public class Apple implements Fruit{
String showSpecifications(){
// some calculations
}
}
public class Orange implements Fruit{
String showSpecifications(){
// some calculations
}
}
public class Kiwi implements Fruit {
String showSpecifications(){
// some calculations
}
}
则可以执行main方法:
public void showObjSpec(Fruit fruit) {
System.out.println(fruit.showSpecifications());
}