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

Java 可以存储多种数据类型的变量,java,generics,inheritance,polymorphism,generic-programming,Java,Generics,Inheritance,Polymorphism,Generic Programming,我需要创建一个类,该类可以在变量中存储Person、Dog或Cat类型的值 我想声明一个变量,因为只有一个特定类型的对象将用于初始化类的实例。为每种类型声明一个变量会浪费资源,因为只会使用一个变量 考虑这一点: Class Container { private Object object; ... Container(Person a){ object = a; } Container(Dog a){ object = a

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

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

考虑这一点:

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()
的返回类型必须是
Object
,这将不起作用

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


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

添加一个接口,比如说
MeatBall
。从
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");
        }
    }
}
您可以使用泛型(您已经猜到的方式):


接口将类关联在一起,赋予它们意义,而泛型则没有。(穆罕默德·阿里)

有两种可能性

  • 超级级。
    • 以一个有一些共同行为的超级类为例,扩展所有 上课
    • 现在声明超级类引用来存储它的子类
    • 这里可以使用泛型边界
    • 看看这里
  • 使用接口。
    • 声明接口并实现所有类
    • 现在在类中声明引用以保存对象
    • 看看这里

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

    为每个类型声明一个变量会浪费资源,因为只会使用一个变量。-你为什么这么认为?我应该使用继承并创建一个子类来处理每种类型吗?听起来是个更好的主意,我假设如果我声明三个变量,系统将为三个变量保留空间。那么继承是一条路吗?谢谢@scarywombatt为什么投票被否决了?这不是我们在爪哇处理人、狗和猫的方式吗?听起来不错。我将学习一些关于接口的知识,看看是否适合我。你对使用泛型有什么看法?接口将类联系在一起,赋予它们意义,而泛型则没有。@MuhammadAli说得很好!我允许在我的答案中添加你的语句。泛型与C++中的模板一样吗?这听起来真的是个好办法。实际上,在发布问题之前,泛型会在搜索中出现,但只想为变量创建模板/泛型。你说的真正属于一起是什么意思?你介意详细阐述吗?”丹尼尔塞拉拉:是的,它和C++模板的概念相同。要对类变量使用泛型,需要使用泛型类。和:有关接口,请参见。您可以将它们用作公共接口以形成契约等,也可以用作标记特殊类的标记接口。但假设的A、B、C将存储在哪里?这应该与继承或泛型结合使用吗?谢谢丹尼尔,更新了我的答案。现在让我知道它是否有用。我将寻找泛型与接口的比较,看看什么最适合我,但我猜答案是两者之一。谢谢!
    public class Container<T> {
        T object;
        Container(T a) {
            object = a;
        }
    
        T getObject() {
            return object;
        }
    }
    
    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 {...