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

Variable that can store several data types

我需要创建一个 class 可以在变量中存储 PersonDogCat.

类型的值

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

考虑一下:

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

最好在控制台中获得正确的输出。

我研究了仿制药和其他东西,但找不到我需要的任何东西。你能告诉我我在找什么吗?

Container 中的 getObject() 可以处理带有 instanceof 的类型,但 getObject() 的 return 类型必须是 Object 那是行不通的。

我正在学习 Java 这真的很困扰我。

我是否应该改用继承并创建一个子class来处理每种类型?

添加接口说 MeatBall。从 MeatBall 导出所有三个 类。现在制作一个将肉丸作为输入的构造函数。以类似的方式存储它。

@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");
        }
    }
}

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

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

    T getObject() {
        return object;
    }
}

或(标记)接口(概括)。 在您的以下代码中,您可以继续使用 Mammal 而不是区分猫和狗:

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 {...

Interfaces relate the classes together giving them a meaning while generics do not. (Muhammad Ali)

两种可能。

  1. 超级Class。
    • 拿一个超级 class 有一些共同的行为并扩展你的所有 classes.
    • 现在声明超级 class 引用以存储它的子 class。
    • 这里可以使用泛型边界。
    • 看这里Generics
  2. 使用界面。
    • 声明接口并实现所有 classes。
    • 现在在您的 class 中声明该引用以保存您的对象。
    • 看这里interfaces

您可以使用 instanceof 运算符和类型转换来处理子 class 特定功能。