我刚刚开始学习java,我有两个基本问题.我的main()看起来像这样:
public class Main {
public static void main(String[] args) {
Storage<BankAccount> aStorage = new Storage<BankAccount>();
Storage<String> sStorage = new Storage<String>();
Class baCls = BankAccount.class;
try {
Object myAccount = baCls.newInstance();
aStorage.setValue( myAccount );
myAccount.deposit( 15 );
}
catch ( InstantiationException e ) {
}
catch ( IllegalAccessException e ) {
}
}}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到这些错误:
之后我试图替换:
Object myAccount = baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)
同
BankAccount myAccount = baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)
但后来我收到了这个错误:
我知道正确的方法是:
BankAccount myAccount = (BankAccount) baCls.newInstance();
Run Code Online (Sandbox Code Playgroud)
但我不确定我理解为什么......我试图从各种来源阅读它,所以我有一些理论,但我仍然无法正确地理解这一点.有人可以帮我理解吗?
PS很抱歉发布这样一个基本问题.
执行BankAccount myAccount = baCls.newInstance()调用反射以创建新对象.Class是通用的,但您尚未指定泛型类型.如果你这样做,Class<BankAccount> baCls = BankAccount.class你就不需要施放.
Java是强类型的.通过声明一个对象,就像object你对该语言说这个对象只是一个对象:就是它只有在所有对象上找到的方法和字段,仅此而已.
通过指定类型,您可以告诉Java您可以访问哪些方法和字段,这就是为什么在您编写时BankAccount myAccount,它允许您调用其上的函数.
但是baCls.newInstance()创建一个baCls类的新实例.它不知道它正在创建什么类型的类,因为它是Class类上的一个方法(令人困惑)本身,所以你必须告诉Java你希望它通过转换返回什么类:BankAccount myAccount = (BankAccount) baCls.newInstance();
然而,更大的问题是你newInstance首先使用的原因.有可能做到:
BankAccount myAccount = new BankAccount();
Run Code Online (Sandbox Code Playgroud)
对于初学者来说,反思有点先进.