我刚刚看到这个关于Java的精彩教程视频,我发现Object类是幕后所有类的超类。因此,通过在处理列表本身时简单地声明Object类,可以轻松处理arraylist中包含多个数据类型的问题。
我的问题是:
为什么不为所有对象声明Object object = new SubObjectClass();
?
这是因为我还没有遇到某种性能低效或内存问题吗?我发现了另一个问题,但我没有看到有人解释为什么不只是拥有Object类声明?
我明白为什么会这样。如果这是一个基本问题,我道歉。
答案 0 :(得分:2)
当然,您可以这样做,但是每次尝试通过变量访问成员时都必须进行类型转换。该类型转换检查需要一些时间来执行,因为如果对象的类与类型转换约束不匹配,它需要确保抛出异常。
通过使用适当类型化的变量,大部分的咀嚼被转移到编译时,只要对象不是null
,就允许(几乎)未经检查的运行时访问成员。
答案 1 :(得分:1)
不使用它的一个原因可能是将对象与其他对象进行比较或分配有问题。
例如:
Object obj = new SubObjectclass();
SubObjectClass subobj = obj;// This will throw error.
SubObjectClass subobj = (SubObjectClass)obj;//This will work.
答案 2 :(得分:1)
你可以像你说的那样点击对象列表:
List<Object> list = new ArrayList<Object>();
这将是'对象'的通用列表,可以存储任何类型的对象。
但是当我们尝试从这样的列表中检索项目时会出现问题 需要将检索到的对象强制转换为特定的Object类型。 为了进一步处理它。
我们不确定哪个对象会脱离列表。
答案 3 :(得分:0)
执行此操作还有另一个问题是您无法使用超类对象访问子类的变量或方法。它只能访问超类的变量或方法
这是示例
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Object obj= new subclass();
System.out.println(obj.i);
System.out.println(obj.abc());
// your code goes here
}
}
class subclass
{
int a;
public int abc(){
return 1;
}
}
以下是我尝试编译时收到的错误:
Main.java:13: error: cannot find symbol
System.out.println(obj.i);
^
symbol: variable i
location: variable obj of type Object
Main.java:14: error: cannot find symbol
System.out.println(obj.abc());
^
symbol: method abc()
location: variable obj of type Object
2 errors
答案 4 :(得分:0)
Java中的类型擦除会产生巨大的性能损失,因为所有内容都必须装箱和取消装箱。如前所述,您也可以在C#中创建对象集合,但应该避免使用。
What are the differences between Generics in C# and Java... and Templates in C++?
http://www.jprl.com/Blog/archive/development/2007/Aug-31.html