为什么 Method Overriding 对 Primitives-Wrapper 以及 Super-Subclasses 参数不起作用,而是抛出?

Why does Method Overriding does not work on Primitives-Wrapper as well as Super-Subclasses parameters but throws?

我测试了以下

class raexception extends Exception{

}
class baexception extends raexception{

}

interface ram{
  public void miya(float a) throws raexception;
}
public class Classy implements ram{
  @Override
  public void miya(Float a) throws baexception {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  } 
}

在上述用例中,

  1. 我可以在投掷部分给 Subclass

  2. 在参数中,我不允许提供 Wrapper class 或 Subclass。

问题: 这种理解是否正确?如果是,是否有任何特定原因允许 subclass 抛出但在方法参数 subclass 中不允许?

您的理解是正确的。 return 类型中也可以使用子类。对于参数,可以使用超类,不能使用子类

无论您重写什么方法,您都属于 "fulfilling a requirement",不是吗?在这种情况下,接口需要有一个名为 miya 的方法,它接收 float 并可能抛出 raexception您可以通过多种方式实现这一点。

一个名为 miya 的方法接受一个 float 但抛出一个 baexception 满足要求。为什么?您可以这样想:方法的调用者希望您的方法抛出 raexception,因此他们能够处理 raexception。现在,他们能处理 baexception 吗?当然是! baexceptionraexception 的子类。

您可以使用相同的推理链来弄清楚为什么可以在参数类型中使用超类,以及为什么可以在 return 类型中使用子类。

关于包装器类型,只是当原始参数传递给包装器类型时,它必须装箱。您的方法的调用者希望只将原始参数放入您的方法中,而不是装箱。您应该将 floatFloat 视为两种不同的类型。您通常可以在赋值上下文中在它们之间进行转换的原因是因为编译器很好。

您的实现必须与接口中的定义兼容。

因为 baexceptionraexception 的子 class,没问题:实现可以抛出任何 baexception:它也是 raexception

您不能使用 Float 参数实现该方法,因为接口指定了 float。 class 中的方法没有实现接口中的方法。

我想编译器可以生成第二个实现 miya(float a) 的方法并生成代码来嵌入参数,但是如果 subclass 覆盖它会发生什么?还是两种方法?