>

나는 그물에 논문의 대부분을 겪었어요,하지만, 난 여전히 우리가 upcasting을 사용해야하는 이유를 이해할 수 아니에요.

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}
class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }
    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}
public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}

업 캐스트를 위해이 예제를 고려할 수 있습니다. 여기서 업 캐스트 사용은 무엇입니까? 모두 d  그리고 a  같은 결과를냅니다!


  • 답변 # 1

    대부분의 상황에서 명시적인 업 캐스트는 전적으로 불필요하며 효과가 없습니다.

    예제에서 명백한 업 캐스트

       Animal a = (Animal)d;
    
    

    다음으로 대체 될 수 있습니다 :

       Animal a = d;    // implicit upcast
    
    

    (Java 오브젝트 유형의 경우) 내재 된 업 캐스트의 목적은 정적 유형 정보를 "잊어"서 특정 유형의 오브젝트를보다 일반적인 유형이 필요한 상황에서 사용할 수 있도록하는 것입니다. 이는 컴파일 타임 유형 검사 및 과부하 해결에는 영향을 미치지 만 런타임 동작에는 영향을 미치지 않습니다.

    정밀도가 손실 (기본 유형, 전환의 업 캐스팅 결과, 수 있고 어떤 경우에는, 예를 들면 long  -> float .)

    <시간>

    그러나 명백한 캐스트가 존재하면 진술/표현의 의미가 바뀌는 상황이있다

    Java에서 업 캐스팅을 사용해야하는 상황 중 하나는 특정 메소드 재정의를 강제로 사용하려는 경우입니다. 예 : 오버로드 된 메소드가 있다고 가정하자 :

    public void doIt(Object o)...
    public void doIt(String s)...
    
    

    문자열이 있고 두 번째가 아닌 첫 번째 오버로드를 호출하려면 다음을 수행해야합니다.

    String arg = ...
    doIt((Object) arg);
    
    

    관련 사례 :

    doIt((Object) null);
    
    
    캐스트 타입 없이는 코드가 컴파일되지 않는

    (이것이 업 캐스트로 간주되는지 확실하지 않지만 여기에 있습니다.)

    두 번째 상황은 다양한 변수를 포함합니다 :

    public void doIt(Object... args)...
    Object[] foo = ...
    doIt(foo);  // passes foo as the argument array
    doIt((Object) foo); // passes new Object[]{foo} as the argument array.
    
    

    세번째 상황은 기본 숫자 유형에 대한 작업을 수행 할 때입니다. 예 :

    int i1 = ...
    int i2 = ...
    long res = i1 + i2;           // 32 bit signed arithmetic ... might overflow
    long res2 = ((long) i1) + i2; // 64 bit signed arithmetic ... won't overflow
    
    

  • 답변 # 2

    What's the need to use Upcasting in java?

    용어가 맞는지 확실하지 않지만 여기에 다음과 같이 설명해야합니다.

    와이즈 비즈

    실제로 중요한 시나리오는 다음과 같습니다.

    upcasting
    Doing a cast from a derived class to a more general base class.

    액세스 수정 자와 관련된 다른 미묘한 상황은 여기에 설명되어 있습니다. Java Oddity : 업 캐스트로 하루를 절약 할 수있는 방법

  • 답변 # 3

    업 캐스트는 예제에서 전혀 의미가 없습니다 (사실 수 없습니다) (있는 경우를 상상해보십시오) 개발자를 혼란스럽게하기 때문에 피해야합니다. 일부 IDE (IntelliJ)는이 줄에 경고를 표시하고 업 캐스팅 제거를 제안합니다)

    편집 : Java의 모든 객체 메소드가 가상이기 때문에이 코드는 동일한 결과를 제공합니다. 즉, 대상 메소드가 참조 유형이 아닌 런타임에 객체의 실제 유형에 의해 감지됩니다. class A { } class B extends A { } public class Test { static void method(A a) { System.out.println("Method A"); } static void method(B b) { System.out.println("Method B"); } public static void main(String[] args) { B b = new B(); method(b); // "Method B" // upcasting a B into an A: method((A) b); // "Method A" } } 를 만들어보십시오  정적이며 어떤 일이 일어나는지 확인하십시오.

  • 답변 # 4

    오버로드 된 메서드가 있고 aioobe가 쓴 것처럼 특수한 메서드를 호출하지 않으려는 경우 업 캐스팅이 필요할 수 있습니다. ( callme() 유형의 새 변수에 할당 할 수 있습니다  대신에.)

    업 캐스트가 필요한 또 다른 예는 A 와 관련이 있습니다.  연산자, 그러나 나는 지금 그것을 기억하지 못한다. 때로는 varargs-methods의 경우 업 캐스트가 필요합니다.

    ?:
    
    

    우리가 public void doSomething(Object... bla) {} 를 통과하려면  단일 매개 변수 (개체가 아닌 개별 매개 변수)로서, 다음 중 하나를 작성해야합니다.

    Object[] array
    
    

    또는

    doSomething((Object)array);
    
    

  • 답변 # 5

    시나리오를 고려하면 Bank는 이자율을 얻는 방법을 제공하는 클래스입니다. 그러나 은행에 따라 이자율이 다를 수 있습니다. 예를 들어 SBI, ICICI 및 AXIS 은행은 8.4 %, 7.3 % 및 9.7 %의 이자율을 제공하고 있습니다.

    doSomething(new Object[]{array});
    
    

    출력 :

    class Bank{  
        float getRateOfInterest(){return 0;}  
    }
    class SBI extends Bank{  
        float getRateOfInterest(){return 8.4f;}  
    }
    class ICICI extends Bank{  
        float getRateOfInterest(){return 7.3f;}  
    }
    class AXIS extends Bank{  
        float getRateOfInterest(){return 9.7f;}  
    }  
    class TestPolymorphism{  
        public static void main(String args[]){  
            Bank b;  
            b=new SBI();  
            System.out.println("SBI Rate of Interest: "+b.getRateOfInterest());  
            b=new ICICI();  
            System.out.println("ICICI Rate of Interest: "+b.getRateOfInterest());  
            b=new AXIS();  
            System.out.println("AXIS Rate of Interest: "+b.getRateOfInterest());  
        }  
    }
    
    
    SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7

  • 이전 angularjson에서 다른 모든 구성 설정에 대한 설명서를 어디서 찾을 수 있습니까?
  • 다음 c - serialPort에서 모든 정보를 쓰도록 파일 만들기