【问题标题】:How to create an object with just one variable, which can be one of two data types?如何创建一个只有一个变量的对象,它可以是两种数据类型之一?
【发布时间】:2013-08-11 10:26:00
【问题描述】:

我想创建一个只包含一个变量的对象,但该变量可以是两种特定数据类型之一。我该怎么做?

我想给它一个 Object(通用)变量,然后检查给定的参数是否在正确的类中。

但后来我尝试创建一个空对象“x”,然后再创建两个对象“a”和“b”,它们扩展了第一个对象。这似乎可以编译。

例如:

x variable = new a(); // okay

x variable2 = new b(); // okay

x variable3 = "hello"; // not okay, since it is a String.

是否有“正确”的方式来做到这一点?我不太喜欢我的第二种方法,因为给我留下了一个空的类文件,而且第一种方法看起来有点笨拙。

编辑:

在上面提到的第一个方法中,类看起来有点像这样:

public class x{
    Object var;

    public x(Object var1){
        if (var1.getClass() == a.class || var1.getClass() == b.class){
            this.var = var1;
        }
    }

}

我还可以为每种数据类型参数组合创建不同的构造函数,如下所示:

public class x {
     Object var;

     public x(a var1){
         this.var = var1;
     }

     public x(b var1){
         this.var = var1;
     }

}

第二种方法使用 3 个不同的类:

public class x{
//empty

}

public class a extends x{
   // some fields
   // constructors
}

public class b extends x{
   // some fields
   // constructors
}

EDIT2 - 问题的更多背景:

我有一个对象“z”,它需要保存两个变量(值得一提)。这些变量可以是“a”、“a”或“a”、“b”或“b”、“a”或“b”、“b”类型。我的程序就是这样。然后我想创建一个可以是“a”或“b”的新数据类型,以简化“z”对象,因此它总是两个“x”变量(可以是“a”或“b” )。

我总是可以在对象“z”中创建两个“a”变量和两个“b”变量,并在初始化它们时保留 2 个空值,但这似乎是一种糟糕的风格。

在我的程序中有一个 ArrayList 类型为“z”的对象。

每个 z 变量有 2 个变量。每个变量可以是 a say 类型的对象,也可以是整数(神秘类型 b),它指向数组中的索引,最终指向另一个 z 变量。

如果你继续跟踪 z 变量,你最终会到达一个 p 变量,这是基本情况。

【问题讨论】:

  • 听起来不对,用一个变量来保存两种不同类型的数据。你真的不需要字段吗?
  • 我认为你应该向我们展示你想要创建的实际类。
  • 我可以这样做,但是其中一个字段将始终为空(空),我必须包含额外的代码来根据程序的当前状态选择正确的程序的主体。我认为这叫做封装?您想在哪里使您的对象易于被任何程序使用?不确定:P。
  • 你必须告诉我们为什么你不能这样做:a variableA = new a();b variableB = new b();int c = 3;
  • 添加了另一个编辑以提供一些背景。

标签: java object variable-assignment conventions


【解决方案1】:

这个任务就是类继承的目的;您应该选择或编写一个类或接口来表示数据类型的共同点,并且变量应该是该类型。数据类型应该继承(实现)超类型。

【讨论】:

  • 您能举个例子吗?谢谢。
  • @GregCawthorne java.swing 有一些很好的例子。 JComponent 代表所有组件共有的东西。它的子类代表特定组件的特性。
【解决方案2】:

也许您正在寻找泛型。

public class DataStorage<T>
{
   private T data;
   public DataStorage(final T data)
   {
      this.data = data;
   }
   public T getData()
   {
      return this.data;
   }
}

DataStorage<a> aData = new DataStorage<a>(new a());
DataStorage<b> bData = new DataStorage<b>(new b());
DataStorage<Integer> intData = new DataStorage<Integer>(new Integer(3));

【讨论】:

  • 感谢您的巧妙建议。虽然我不确定这在功能上与我在 OP 中建议的第一种方法(使用 Object 数据类型)有何不同?因为似乎接受任何数据类型,除非你在哪里包括检查。不过我可能错了。
  • 你有类型安全。你可以这样做:Integer intValue = intData.getData(); 没有任何演员表。
  • 我认为我不需要类型安全。除非铸造是一个昂贵的过程,而这会减少它?
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2017-05-26
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多