- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题出在我的第二个开关案例 1 上:我将放置“arrayEmployees[0]”。但它在父类(super class) PersonData 或子类 personLocation 中看不到我的方法。我对多态性以及内部“对象”可能性的理解有点可疑,因为我刚刚开始学习这些,所以也许我引用它们是错误的。
我得到了以下指示:
Design a new class called PersonTest with a main method that defines a PersonData object and a PersonLocation object (both without arguments) and two more objects with arguments and store all the objects in an Array for retrieval and modification of instantiated objects (i.e. Array of Objects).
我的实际代码
package lab5;
import java.util.InputMismatchException;
import java.util.Scanner;
public class PersonTest
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
PersonLocation personLocation = new PersonLocation();
PersonData personData = new PersonData();
PersonLocation personLocationOverLoaded = new PersonLocation("Hamilton");
PersonData personDataOverloaded = new PersonData("Stirling", "905-567-7656");
Object[] arrayEmployees = new Object[4];
arrayEmployees[0] = personLocation;
arrayEmployees[1] = personLocationOverLoaded;
arrayEmployees[2] = personData;
arrayEmployees[3] = personDataOverloaded;
int user = 0;
int menu = 0;
// Get input here, put into variable "user"
switch(user)
{
case 1:
System.out.print("Printing Object Information With Given Values\n\n\t");
arrayEmployees[0]. //Issue
}
}//End Main Method
}//End Class PersonTest
应该发生什么:我应该能够从我的数组中进行引用,如上所示(arrayEmployees[0]。),并为该特定类显示我的方法。
最佳答案
Object[] arrayEmployees = new Object[4];
arrayEmployees[0] = personLocation;
arrayEmployees[1] = personLocationOverLoaded;
arrayEmployees[2] = personData;
arrayEmployees[3] = personDataOverloaded;
实际上,这完全完成了您想做的事情。这是一个包含给定类型及其父类(super class)对象的数组。
但是,正如您所注意到的,这样做会丢失一些信息。
当您创建Object[]
时,您告诉编译器“这是一个 Object
的数组”。因此,当您检索该数组的元素时,编译器只知道“该数组包含 Object
s”。它不知道前两个元素是 PersonLocation
实例,并且不知道最后两个元素是 personData
元素。它只知道数组包含 Object
s。
这是 Java 中集合一般工作方式的基本限制。 Java 中的集合有一个“整体”类型,就像你总是有“Collection
of Number
s”、“array of PersonData
s”、“ArrayList
of String
s"等,而不是 "Collection
of Integer
s 和 Double
s`"因此,无论内部内容的实际类型,所有编译器都知道您将从集合中获取的对象的类型就是该集合的类型。
例如,假设我有 List<Number> list = new ArrayList<Number>();
。编译器只知道内容是 Number
s。它不知道第一个元素是否是 Integer
, Double
, Long
等等,这只是一个 Number
。因此,您不能使用 Long
-具体方法如list.get(0).longValue()
,因为编译器无法保证第一个元素是 Integer
。它只知道list.get(0)
返回 Number
,以及Number
没有 longValue()
方法。
那么如何解决这个问题呢?
您有几个选择。
instanceof
运算符(operator)进行测试arrayEmployees[0]
其实际类型,然后根据需要进行强制转换并执行所需的方法。这比较尴尬,但如果您必须有一个数组,那么您实际上没有太多选择。考虑到您需要执行的分配,似乎多个数组不是一个选项,因为指令指定了单个数组,因此您可能需要进行测试和转换。总体思路如下:
<variable> instanceof <type>
测试是否 variable
是-a <type>
。例如:
arrayEmployees[0] instanceof PersonLocation
测试是否 arrayEmployees[0]
是 PersonLocation
.
此测试返回 boolean
,因此您可以将其用作 if
的条件陈述。里面if
声明,你可以垂头丧气arrayEmployees[0]
进入临时引用:
if (arrayEmployees[0] instanceof PersonLocation) {
PersonLocation temp = (PersonLocation) arrayEmployees[0];
// execute whatever you need on temp
}
请注意 -- instanceOf
也将匹配子类。所以两者x instanceof Integer
和x instanceof Number
都会返回 true
如果x
声明为Integer x = 1;
.
希望这足以让您开始。如有任何问题,请随时提出。
关于java - 创建保存父类(super class)和子类对象的对象数组的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298851/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!