我的代码:
FileChooser prompt = new FileChooser();
prompt.setTitle("Odaberi fajl");
source = (Source) prompt.showOpenDialog(new Stage());
其中source是一个扩展File的类:
import java.io.File;
public class Source extends File {
public Source(String pathname) {
super(pathname);
}
}
尝试强制转换为Source时,会返回错误。我不知道造成这种情况的原因。
答案 0 :(得分:2)
FileChooser
返回File
。是什么让你觉得你可以把它投到Source
?它不是Source
。
你想要做的是:
让Source
包围File
并提供您需要的任何自定义方法,并根据需要委托给包含的File
。
public class Source {
private File f;
public Source(File f) {
this.f = f;
}
// Custom methods
...
// Delegating methods
public boolean exists() {
return f.exists();
}
...
}
正如您所做的那样扩展File
,但提供一个构造函数,该构造函数接受另一个File
(即复制构造函数)并使用传递的Source
实例化File
{1}}。
public class Source extends File {
public Source(File f) {
super(f.getAbsolutePath());
}
// Custom methods
...
}
然后实例化如下:
FileChooser prompt = new FileChooser();
prompt.setTitle("Odaberi fajl");
source = new Source(prompt.showOpenDialog(new Stage()));
答案 1 :(得分:0)
你需要了解演员的作用。
Casting是一个编译时指令;它告诉编译器正在执行的操作(在您的情况下为showOpenDialog()
)将返回与强制转换匹配的对象。如果事实证明不是真的,那么程序将在运行时抛出IllegalCastException
。由程序员编写演员来确保演员在运行时是正确的。在许多情况下,编译器会告诉您是否没有可能的方法使其正确,但在所有情况下都无法告诉您。
FileChooser
是在不知道您的Source
类的情况下编写的,因此它无法返回Source
个对象。如果强制转换成功,则允许(由编译器)在结果对象上调用来自Source
的方法,这显然是不正确的。
关于强制转换的一件事是,除了涉及盒装基元的非常有限的情况之外,强制转换根本不会改变所引用的对象。其目的是让编译器知道操作在结果类上是合法的。
顺便说一句,在提出问题说出会发生什么时,它会有很大帮助,而不仅仅是“返回错误”。这是编译或运行时错误吗?这个错误说的是什么?如果您将来提出问题,请记住。