可以存储多种数据类型的变量

时间:2018-04-10 05:09:16

标签: java generics inheritance polymorphism generic-programming

我需要创建一个类,该类可以在变量中存储PersonDogCat类型的值。

我想声明一个变量,因为只有一个特定类型的对象将用于初始化该类的实例。为每种类型声明一个变量将浪费资源,因为只会使用一个。

考虑一下:

Class Container {
    private Object object;
    ...
    Container(Person a){
        object = a;
    }
    Container(Dog a){
        object = a;
    }
    Container(Cat a){
        object = a;
    }
    ...
}

然后做:

Container contA = new Container(A);
Container contB = new Container(B);

System.out.println(contA.getObject().toString());
System.out.println(contA.getObject().toString());

理想情况下,在控制台中获得正确的输出。

我研究了仿制药和其他东西,但却无法找到我需要的东西。你能指点我正在寻找的东西吗?

getObject()中的Container可以使用instanceof处理该类型,但getObject()的返回类型必须为Object且不会工作

我正在学习Java,这真的让我烦恼。

我应该使用继承并创建一个子类来处理每种类型吗?

4 个答案:

答案 0 :(得分:5)

你可以使用泛型(你已经猜到了):

public class Container<T> {
    T object;
    Container(T a) {
        object = a;
    }

    T getObject() {
        return object;
    }
}

或(标记)接口(泛化)。 在您的以下代码中,您可以继续使用Mammal而不是区分Cats和Dogs:

public interface Mammal {
}

public class Container {
    Mammal object;
    Container(Mammal a) {
        object = a;
    }

    Mammal getObject() {
        return object;
    }
}

public class Cat implements Mammal {...
public class Dog implements Mammal {...
public class Person implements Mammal {...
  

接口将类关联起来,赋予它们一定的含义,而泛型则不然。 (穆罕默德阿里)

答案 1 :(得分:2)

添加一个界面说MeatBall。从MeatBall派生所有三个班级。现在创建一个以肉丸为输入的构造函数。以类似的方式存储它。

答案 2 :(得分:1)

两种可能性。

  1. 超级班。
    • 参加超级课程有一些共同的行为,并扩展你的所有 类。
    • 现在声明超类引用以存储它子类。
    • 在这里你可以使用泛型界限。
    • 请看这里Generics
  2. 使用界面。
    • 声明接口并实现所有类。
    • 现在在您的班级中声明该引用以保存您的对象。
    • 请看这里interfaces
  3. 您可以使用instanceof运算符和类型转换来处理子类特定的功能。

答案 3 :(得分:0)

@Daniel为什么你没有多个if块检查各自的类型并进行条件操作?

喜欢:

class Container {
    private Object object;

    Container() {

    }

    Container(Object a) {
        object = a;
    }

    public Object getInstance(){
        return object;
    }
}

class Dog extends Container {

    Dog() {

    }

    Dog(Object a) {
        super(a);
    }
}

class Cat extends Container {

    Cat() {

    }

    Cat(Object a) {
        super(a);
    }
}

public class ExampleCode {

    public static void main(String[] args) {
        Dog dogRef = new Dog();
        Cat catRef = new Cat();

        Container contReference1 = new Container(dogRef); 

        if(contReference1.getInstance() instanceof Dog)
        {
            System.out.println("Its a Dog");
        }else if(contReference1.getInstance() instanceof Cat)
        {
            System.out.println("Its a Cat");
        }else
        {
            System.out.println("Error: Unknown Object");
        }
    }
}