比如有一个抽象类,里面定义了抽象方法,抽象方法要根据输入的参数自动进行识别并进行相应的处理,我想除了以下的方法之外,有没有自己定义一个宽泛些的对象类型,使得输入的数据能够支持从字节流到文本到数组等等所有内容都包括进去?然后按照对象类型(貌似同C的构造体应该相似吧。)public void abstractfunc1(int input);
public void abstractfunc1(String input);我表述不太清楚还希望大家见谅。

解决方案 »

  1.   

    是这个意思么?
    public Object input(Object o){
    if(o typeof O){
    ...
    }else if(o typeof X){
    ...
    }
    ...
    }
      

  2.   

    那如果要是返回了OBJECT对象,对象里其实只有一个简单的数组,怎么输出内容呢?out.print(object)显示NULL,
    我用的toString,toArray都不行,有没类似能够DEBUG变量内容的函数了
      

  3.   

    首先不建议这样写。
    其次,你说的这个是参数的封装问题,可以把需要的各种参数类型封装到一个类里,然后用这个类作为抽象方法的参数,比如:
    public class Param(){
      private byte[] b;
      private String s;
    .......
    }
      

  4.   

    感觉这种封装想法不错,但是没想明白,那你调用的时候,你怎么调用呢,param.getString,param.getArray……要是这样感觉还不如直接用集合方便,也不用定义直接运用。
    我现在想到的,就是写几个实现类,子类继承的时候,分别实现字符串,数组的功能。
    欢迎拍砖
      

  5.   


    什么是多态? 是同一个类型的,说白了就是有一个共性的,
    你说的是“从字节流到文本到数组等等所有内容都包括进...” 这些有什么共性,或者能抽象成什么类型?
    如果你非要说都有父类Object,那就没办法了。你可以想象为什么出泛型,,你想的那个可以多重载几个方法到是不错的,但是没有说些一起的,你看看spring ,struts哪些源码 ,这种情况下都是重载几个方法。
      

  6.   

    您说的有道理哈。
    我是这么考虑的,对于计算机设计人员来说,或许他会考虑很多,考虑数组、字节流、字符串等等,但是对于用户来说,他们只需要的显示在终端的信息,而且大多数的情况下,我觉得一张二维表就足够使用,所以我的想法是不管是什么类型的信息都能转换为二维数组。
    之所以想用这个Object类,而不用重载,是因为考虑到以后的扩展不确定的问题,因为不清楚未来使用的输入变量或者返回值是什么类型的。不知道我这样想合适不合适。 
      

  7.   

    你的想法很好,想到以后扩展,但是这样做不但不能很好的扩展还会失去了面向对象设计的基本原则,你写个Object,别人谁都看不懂你想要什么类型,输入什么才能正确,不能传入就报错,或者叫调用者看你源码。扩展是通过一些设面向对象特性,计原则来实现的,包括很好的使用设计模式,等等。其实重载和重写本身就是多态的引用也是为了更好兼容和扩展设计的。
    程序设计是严格的,是一就不是二。你这个问题java.io早都考虑到了,你去看看InputStream 他为什么有3个read()方法。为什么不写一个。
    建议你看看面相对象设计原则,java设计模式前几章。
      

  8.   

    其实你可以使用方法重载.
    把java基本的8个数据类型定义了,
    然后留一个object .
    public abstract class Test{

    public abstract void show(char s){

    }

    public abstract void show(int s){

    }

    public abstract void show(double s){

    }

    public abstract void show(boolean s){

    }

    public abstract void show(short s){

    }

    public abstract void show(byte s){

    }

    public abstract void show(float s){

    }

    public abstract void show(long s){

    }

    public abstract void show(String s){

    }

    public abstract void show(Object s){

    }}其实这样做就基本可以满足了,个人觉得,这样做会比那样好些。
    但建议还是明确数据类型,至少大致知道传到里面是什么东西,不然很难进行另外的操作。
    如果你是要输出的话,完全可以单独开一个类,写输出方法(比如:数组写数组的,集合写集合的,基本类型写基本类型的,引用写引用的)、