gpt4 book ai didi

java - 实现 URL.openConnection() 以便可以进行强制转换

转载 作者:行者123 更新时间:2023-11-30 06:05:26 25 4
gpt4 key购买 nike

我不明白为什么抽象类可以转换为它的任何子类。例如:

URL url = new URL("http://www.google.com");
HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();

我注意到 openConnection() 返回一个 URLConnection 实例,它是一个抽象类。如何实现它(使用一个更简单的示例)以便将其转换为子类?

例如,如果我有:

abstract class C1
{
abstract void f1();
abstract void f2();
}

class C2 extends C1
{
@Override
void f1() {
System.out.println("f12");
}

@Override
void f2() {
System.out.println("f22");
}

void f3() {
System.out.println("f32");
}
}

class C3 extends C1 {
@Override
void f1() {
System.out.println("f13");
}

@Override
void f2() {
System.out.println("f23");
}

void f3() {
System.out.println("f33");
}
}

public class Main {
public static void main(String args[]) {
C2 c2 = new C2();
C3 c3 = new C3();
C1 c1 = c3;

c3 = (C3) c1;
c2 = (C2) c1;
}
}

则 c3 = (C3) c1;会起作用,但第二个 Actor 不会(我在这种情况下理解的事情)。

那么我们如何知道 openConnection() 是否返回正确的子类(以便在转换时不会导致运行时异常)?我假设返回对象的形式可能是:

return (URLConnection) obj;

其中 obj 被声明为 HttpUrlConnection 或 JarURLConnection。

或者返回一些使用 lambda 表达式或匿名方法(不进行强制转换)声明的 obj。

更新:

JarURLConnection hpCon = (JarURLConnection) hp.openConnection();

实际上会导致运行时异常:“线程“main”java.lang.ClassCastException中的异常:sun.net.www.protocol.http.HttpURLConnection无法转换为java.net.JarURLConnection”

为什么 openConnection() 返回 URLConnection,如果它实际上是 HttpURLConnection 并且转换为 JarURLConnection 会失败?

最佳答案

您的示例将在运行时引发 ClassCastException,因为 c1 不是 c2 类型。

向下转换:从父类(super class)到实现是不安全的,因此这就是为什么您需要使用 (C3) 显式转换它,而向上转换(从 C3 到 C1)是安全的,您不需要输入它。

您的代码发生的情况是您删除了旧类型并尝试使用显式强制转换重新签名,这将在运行时导致 ClassCastException(从 C3 到 C2)。

请注意,例如以下内容将无法编译:

 C3 c3 = (C3) new C2();

虽然这样做(但在运行时崩溃):

 C3 c3 = (C3) (C1) new C2();

URLConnection 的示例有效,因为 openConnection 确实返回 HttpUrlConnection 的实例,但仍然需要对其类型进行不安全的转换。请注意,HttpsUrlConnection 可以从 openConnection 返回,但由于它扩展了 HttpUrlConnection,因此可以将其转换为它。

关于java - 实现 URL.openConnection() 以便可以进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com