[英]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.
}
}
在上述用例中,
我可以在 Throws 部分給出子類
在參數中,我不允許給 Wrapper class 或 Subclass。
問:這個理解正確嗎? 如果是,是否有任何特定原因允許子類拋出但不允許在方法參數子類中拋出?
你的理解是正確的。 子類也可以用於返回類型。 對於參數,可以使用超類,而不是子類。
無論您使用哪種方法,您都是一種“滿足要求”,不是嗎? 在這種情況下,接口需要有一個名為miya
的方法,該方法接受一個float
並可能拋出一個raexception
。 您可以通過不止一種方式來實現這一點。
一個名為miya
的方法接受一個float
但拋出一個baexception
滿足要求。 為什么? 你可以這樣想:方法的調用者期望你的方法拋出一個raexception
,所以他們能夠處理一個raexception
。 現在,他們能夠處理baexception
嗎? 他們當然是! baexception
是raexception
的子類。
您可以使用相同的推理鏈來弄清楚為什么可以在參數類型中使用超類,以及為什么可以在返回類型中使用子類。
關於包裝器類型,只是當原始參數傳遞給包裝器類型時,它必須裝箱。 您的方法的調用者只希望將原始 arguments 放入您的方法中,而不是裝箱。 您應該將float
和Float
視為兩種不同的類型。 您通常可以在賦值上下文中在它們之間進行轉換的原因是因為編譯器很好。
您的實現必須與接口中的定義兼容。
因為baexception
是raexception
的子類,所以沒有問題:實現可以拋出任何baexception
:它也是一個raexception
。
您不能使用Float
參數實現該方法,因為接口指定了一個float
。 class中的方法沒有實現接口中的那個。
我猜編譯器可以生成第二個實現miya(float a)
的方法並生成代碼來嵌入參數,但是如果子類覆蓋它會發生什么? 或兩種方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.