我需要创建一个类,该类可以在变量中存储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());
理想情况下,在控制台中获得正确的输出。
我研究了仿制药和其他东西,但却无法找到我需要的东西。你能指点我正在寻找的东西吗?
getObject()
中的Container
可以使用instanceof
处理该类型,但getObject()
的返回类型必须为Object
且不会工作
我正在学习Java,这真的让我烦恼。
我应该使用继承并创建一个子类来处理每种类型吗?
答案 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)
两种可能性。
您可以使用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");
}
}
}