2012-04-13 2 views
2

인스턴스를 특정 유형으로 선언하기 위해 약간 혼란 스럽습니다. 예를 들어, 인스턴스를 특정 유형으로 캐스트하는 시점은 무엇입니까?

Integer intOb1 = new Integer(3); 
Object intOb2 = new Integer(4); 

나는 intOb1의 유형 Integer 알고, 그리고 intOb2의 유형 Object입니다,하지만 Object 같은 intOb2 하나가 수행 할 수 선언 하는가? Object에있는 메소드를 사용 하시겠습니까? 이미 해당 방법을 Integer으로 사용할 수 없습니까? 아니면 그냥 intOb2을 "치료"할 수있는 주된 목적입니까?

자세히 알 수 있듯이 나는 멍청하다.

답변

2

이 실제는 캐스팅되지 않습니다. 다형성의 예입니다. 변수를 사용하면 다른 클래스와의 상속 관계를 기반으로 다른 유형을 사용할 수 있습니다.

예를 들어, 동물원을 시뮬레이트하기위한 프로그램을 작성한다고 가정합니다. Zoo 클래스와 Animal 클래스가 있습니다. Animal 클래스에서 확장되는 클래스는 Lion, ZebraElephant입니다.

그들은 즉, 다른 유형의 때문에 하나의리스트에 함께 그룹화 이러한 모든 개체를 유지하기 위해 매우 유용 할 수 있지만 다음과 같습니다 Lion는, Zebra이, 그리고 Elephant, 단일 목록에 저장할 수없는 경우 에 대해 각각 유형의 동물 목록을 유지해야합니다. 이것은 다형성이 작용하는 곳입니다. 클래스 Lion, Zebra 각각 이후

Elephant 모두 우리가 단순히 유형 Animal의 목록에 저장할 수있는 Animal 클래스에서 확장 할 수 있습니다.

코드 예제 : 심지어 바보 같은 예를 들어이 도움이

public class Zoo 
{ 
    private List<Animal> animals; 

    public Zoo() 
    { 
     this.animals = new ArrayList<>(); 
    } 

    //notice this method takes an Animal object as a parameter 
    public void add(Animal a) 
    { 
     this.animals.add(a); 
    } 
} 

public abstract class Animal 
{ 
    private String name; 
    private String type; 

    public Animal(String name, String type) 
    { 
     this.name = name; 
     this.type = type; 
    } 

    //all subclasses must implement this method 
    public abstract void speak(); 
} 

public class Lion extends Animal 
{ 
    private String animalType = "Lion"; 

    public Lion(String name) 
    { 
     super(name, animalType); 
    } 

    public void speak() 
    { 
     System.out.println("ROAR"); 
    } 
} 

//....etc for the other two animals 

public class TestZoo 
{ 
    public static void main(String[] args) 
    { 
     Zoo myZoo = new Zoo(); 
     Lion l  = new Lion("Larry"); 
     Elephant e = new Elephant("Eli"); 
     Zebra z = new Zebra("Zayne"); 

     myZoo.add(l); //<-- note that here I don't pass Animal objects to the 
     myZoo.add(e); // add method but subclasses of Animal 
     myZoo.add(z); 
    } 
} 

희망.

+0

그게 합리적이긴하지만 주된 방법으로 내가 대신 쓰면 'Animal l = new Lion ("Larry"); 동물 e = 새로운 코끼리 ("엘리"); 동물 z = 새로운 지브라 ("Zayne"); ' 어떤 새로운 기능이 있습니까? –

+0

@ Hubrid 당신이 제공하는 기능은 모두 다른 유형을 가지고 있지만 같은 목록이나 컨테이너에 모든 개체를 저장할 수 있다는 것입니다. –

+0

나는 Animal 오브젝트를 만들 수있는 올바른 방법이라는 것을 안다. 나는 왜 Animal l = new Lion ("Larry")이''Lion l = new Lion (" 래리 "); –

2

Object이 관련되어 있으면 어디서나 도움이되지 않는 제네릭 유형이므로 아무 것도 얻을 수 없습니다. listArrayList이며 선언하는 것은 단지 일반 List 컬렉션 코드를 통해 어떤 ArrayList 특정를 사용하지 않을 것이라는 사실을 적용 :

List<String> list = new ArrayList<String>(); 

이 특정 무언가를 의미

그러나 다른 상황에 대해 생각 방법.

이렇게하면 특정 구현에 의존하지 않는다는 것을 효과적으로 알릴 수 있습니다. 나중에 ArrayList<String>()LinkedList<String>()으로 바꿀 수 있습니다. 다른 것을 수정할 필요가 없습니다.

+0

오케이 - 그 말이 맞습니다. –

+0

@ Hunter의 요점은 중요하다고 생각합니다. OP가 여기에서 한 것은 전혀 (명백한) 주조가 아닙니다. –

+0

정확히 무엇이라고 부를지 모르겠다. 미안하다. –

0

모든 클래스는 "개체"대신

의 서브 클래스이기 때문에 사람이 형의 Object 클래스의 객체를 생성하는 이유, 당신이 이해할 필요가 당신은 항상 클래스의 모든 유형의 개체에서 "개체"클래스의 방법을 사용할 수 있습니다 :

유형 캐스팅은 일반적으로 일부 메소드/기능을 작성하고자 할 때 필요하며 어떤 유형의 객체가 입력으로 올지 모르는 경우 확실합니다. JDK에서 가장 공통적 인 예제 중 하나는 비교 메서드에서 equals 메서드 또는 compare 메서드입니다.

// Object equals method - written for such generic use. 
boolean  equals(Object obj) { 
    //Here you might want to check which is other type of object. 
    if (!obj instanceof CurrentClass) { 
     return false; 
    } 
    //Additional logic required to check equality of object. 
} 

이전의 컬렉션 라이브러리 (JDK 1.4)에도 비슷한 케이스가 있었지만 JDK 1.5에는 generic이라는 새로운 기능이 도입되었습니다.

관련 문제