java.io.file无法强制转换为自定义类

时间:2016-07-16 19:31:03

标签: java inheritance

我的代码:

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时,

会返回错误。我不知道造成这种情况的原因。

2 个答案:

答案 0 :(得分:2)

FileChooser返回File。是什么让你觉得你可以把它投到Source?它不是Source

你想要做的是:

  1. 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();
        }
        ...
    }
    
  2. 正如您所做的那样扩展File,但提供一个构造函数,该构造函数接受另一个File(即复制构造函数)并使用传递的Source实例化File {1}}。

    public class Source extends File {
        public Source(File f) {
            super(f.getAbsolutePath());
        }
        // Custom methods
        ...
    }
    
  3. 然后实例化如下:

    FileChooser prompt = new FileChooser();
    prompt.setTitle("Odaberi fajl");
    source = new Source(prompt.showOpenDialog(new Stage()));
    

答案 1 :(得分:0)

你需要了解演员的作用。

Casting是一个编译时指令;它告诉编译器正在执行的操作(在您的情况下为showOpenDialog())将返回与强制转换匹配的对象。如果事实证明不是真的,那么程序将在运行时抛出IllegalCastException。由程序员编写演员来确保演员在运行时是正确的。在许多情况下,编译器会告诉您是否没有可能的方法使其正确,但在所有情况下都无法告诉您。

FileChooser是在不知道您的Source类的情况下编写的,因此它无法返回Source个对象。如果强制转换成功,则允许(由编译器)在结果对象上调用来自Source的方法,这显然是不正确的。

关于强制转换的一件事是,除了涉及盒装基元的非常有限的情况之外,强制转换根本不会改变所引用的对象。其目的是让编译器知道操作在结果类上是合法的。

顺便说一句,在提出问题说出会发生什么时,它会有很大帮助,而不仅仅是“返回错误”。这是编译或运行时错误吗?这个错误说的是什么?如果您将来提出问题,请记住。