gpt4 book ai didi

java - 调用类型变量的基本和派生静态方法

转载 作者:太空狗 更新时间:2023-10-29 22:38:42 25 4
gpt4 key购买 nike

我有以下示例:

class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
A<ConcreteErrorHandler> a = new A<ConcreteErrorHandler>();
a.m(); //Exception here!
}

public static class AbstractErrorHandler {
public static void handle(){
throw new UnsupportedOperationException("Not implemented");
}
}

public static class ConcreteErrorHandler extends AbstractErrorHandler{
public static void handle(){
System.out.println("Concrete handler");
}
}

public static class A<T extends AbstractErrorHandler>{
public void m(){
T.handle();
}
}
}

IDEONE

为什么调用基类的方法,而不调用派生类的方法? handle() 方法的签名完全相同。我知道静态方法不会继承,但在我的情况下不应该抛出编译时错误吗?

有人可以解释这种行为吗?

最佳答案

原因是编译器不知道AbstractErrorHandler 的哪个子类型将在运行时替换T。这就是为什么它只是将方法调用 T.handle() 绑定(bind)到 AbstractErrorHandler.handle() 方法。

这里的问题是您将继承与 Java 类的 static 特性混合在一起。

为了让它(正确地)工作,你必须摆脱 .handle() 方法的 static 修饰符并保留 的实例>TA 类中。此 T 实例(在运行时)将是 AbstractErrorHandler 的某个特定子类,然后是 actual .handle()方法将被执行。

例如:

class Ideone {
public static void main(String[] args) throws java.lang.Exception {
A<ConcreteErrorHandler> a = new A<ConcreteErrorHandler>(new ConcreteErrorHandler());
a.m();
}

public static class AbstractErrorHandler {
public void handle() {
throw new UnsupportedOperationException("Not implemented");
}
}

public static class ConcreteErrorHandler extends AbstractErrorHandler {
public void handle() {
System.out.println("Concrete handler");
}
}

public static class A<T extends AbstractErrorHandler> {

T instance;

A(T instance) {
this.instance = instance;
}

public void m() {
instance.handle();
}
}
}

关于java - 调用类型变量的基本和派生静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215160/

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