灵活的Java函数输入

  • 本文关键字:函数 Java java
  • 更新时间 :
  • 英文 :


我有三个类,它们有一个同名的函数。在另一个类中,我想把类作为输入并使用那个函数,但我不知道怎么做。例如:

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());
}

最新更新