假设我有这两个对象:
Color c = new Color();
Shape s = new Shape();
和带有一些签名的run()方法。
现在假设我想使用对象颜色调用run方法,有时使用对象形状。我可以做这样的事情:
run(c);
public void( Color c){
//a bunch of code
}
或类似的东西:
run(s);
public void( Shape s){
//a bunch of code
}
正如您所看到的,这是一个糟糕的解决方案,因为我再次创建相同的方法但使用不同的签名并重复一堆代码2次。有没有办法传递一个通用对象做这个运行方法,然后使用它?当然没有重复的代码?
答案 0 :(得分:0)
是的,您可以使用Object类。
每个对象都有Object类的继承,这意味着每个对象都是对象类的成员。
如果您的方法签名要求一个Object,那么任何对象都是有效的。
public void( Object o) {
// some code
}
形状和颜色都是对象,因此两者都适合此方法签名。
答案 1 :(得分:0)
您有两种选择: 1.创建对象的公共接口并用它定义函数:
public void run(CommonInterface c)
2。接受Object
作为参数:
public void run(Object o)
答案 2 :(得分:0)
java中的所有对象都扩展(最后)java.lang.Object类。
所以,如果你想要一个“泛型”方法,你应该写一些类似的东西:
public void methodName(Object o) {
...
}
但是,请确保在此方法中进行相应的转换。
您可以使用以下内容:
if (o instanceof Shape) {
Shape s = (Shape) o;
} else if (o instanceof Color) {
Color c = (Color) o
}
还有其他选项,例如将接口作为方法的参数传递,两个类都应该实现该接口。
答案 3 :(得分:0)
提出的问题是邀请非常具体的答案。正如其他人所指出的,如果有两个对象都可以实现的接口,那么这是最好的方法。可以接受Object作为参数,然后(可能)确定类型。但是,这个问题稍有问题,因为它没有描述实际的预期结果。这是XY problem。
当一个人拥有一个Texture对象时会发生什么?调整代码以持续处理未实现通用接口的新类型将导致维护成本非常高。因此,需要考虑整体设计。更有可能的解决方案是run()应该在每个Object上实现,而不是直接获取各种对象类型的方法。
尽管我并不喜欢这本书,但这个问题提出的维护示例在 Head First面向对象的分析和设计中得到了很好的描述。
答案 4 :(得分:0)
我认为这里重要的是你想要在// A bunch of code
中做些什么。例如,如果要调用.toString()
的{{1}}方法,则可以传递对象,但如果您希望执行更多操作,则需要更具体。
答案 5 :(得分:0)
我认为以下示例将能够为您提供帮助。
界面I {}
A类实现I {}
B类实现I {}
班级演示{
public static void main(String [] args){
演示d =新演示();
d.run(new A());
d.run(new B());
}
公开<
T延伸我>
void run(T t){
// TODO do here you logic
}
}