在继承中将可变长度参数列表更改为固定大小

时间:2014-05-01 08:39:38

标签: java inheritance variadic-functions

要求

  1. 我需要一种多态方法。
  2. 子类中的参数列表大小不同。
  3. 子类中的参数可能来自不同的子类型,我希望编译器在子类中执行关于确定的子类型的类型检查;
  4. 因此列表或数组不适合作为参数。因为它们不会强制大小或确切的子类型!

    更多细节和示例

    [这些代码仅供参考,您可能会发现编译错误。]

    第一种情况

    我需要一个带有接受可变长度参数列表的方法的基类。这允许我有一个普通班级。例如:

    abstract class baseClass{
        public abstract void serialize(Object... data);
    }
    

    现在我想创建一些特定的子类,所以我需要在子类中有固定大小的参数列表。例如像这样的东西(但这种语法错了!):

    class subClass1 extends baseClass{
        @Override
        public void serialize(Object data1){
            //method body...
        }
    }
    class subClass2 extends baseClass{
        @Override
        public void serialize(Object data1, Object data2){
            //method body...
        }
    }
    

    我应该如何编写子类?

    第二种情况

    在其他情况下,我的子类想明确定义参数的类型(因为这将允许编译时检查)。例如:

    class subClass3 extends baseClass{
        @Override
        public void serialize(int data1){
            //method body...
        }
    }
    class subClass4 extends baseClass{
        @Override
        public void serialize(int data1, double data2, String data3){
            //method body...
        }
    }
    

    我应该怎么写这个?

2 个答案:

答案 0 :(得分:0)

重写的一个重要规则......

  
      
  1. 参数列表应与被覆盖的列表完全相同   方法
  2.   

参考其他规则  http://www.tutorialspoint.com/java/java_overriding.htm

或者您也可以使用重载。类似下面的代码,可以出现在子类

    void test(Object data) {
// some logic here
        super.test(data);
    }

我不知道你的要求是什么,但我可能会制作超级方法"参数化"这样子类可以提供具体的实现。

==================== EDITED ========================== =========== 我不知道你的用例。但根据帖子,以下是我能想到的解决方案。请检查一下是否有效。

abstract class baseClass<T>{
    public abstract void serialize(T... data);
}
class subClass1 extends baseClass <String>{
    @Override
    public void serialize(String... data) {
        if(data.length>1)throw new IllegalArgumentException("Accepts only single string");
    }
}
class subClass2 extends baseClass<Integer>{
    @Override
    public void serialize(Integer... data) {
    }
}
public static void main(String[] args) {

    baseClass<String> sc1 = new subClass1();
    sc1.serialize("test");

    baseClass<Integer> sc2 = new subClass2();
    sc2.serialize(1,2);
}

答案 1 :(得分:0)

之前我还没有使用过序列化数据,但你可以这样做:

public abstract void serialize(Object[] data)
{
    for(Object obj : data)
    {
        //do something
    }
}

-Kaz