2013-07-08 5 views
1

? 그들은 모두 LinkedList 개체를 보유하고 있습니까? 내가 고슬링의에서 개체 당신은 내가 유형의 목록입니다 new LinkedList()도 불구하고 그것을에게 LinkedList를 만들어이 경우, 그것은 수 을 만들 었는지 될 것이라고 주장한다 "자바 프로그래밍 언어" 을 읽을 것과는 반대로슈퍼 클래스 유형 또는 하위 클래스 유형

어떻게 올바르게 신고해야합니까? 방법의 addFirst이 L1 입력하는 동안

Collection<String> c = new LinkedList<String>(); 
List<String> c = new LinkedList<String>(); 
LinkedList<String> c = new LinkedList<String>(); 

답변

8

왜 L2 유형은 방법의 addFirst이없는 무엇입니까? l2의 컴파일시의 형태이기 때문에

단지 List<E>List<E>addFirst 방법을 선언하지 않습니다. xString 객체를 참조, 실행시

Object x = "hello"; 
int invalid = x.length(); // This is invalid 

,하지만 당신은 String.length() 메서드를 호출 할 수 있도록 변수 자체의 유형은 단지 Object입니다 : 간단한 예를 들어

은 고려 .

그것은 여기에 세 가지 다른 용어를 구분하는 것은 매우 중요합니다 :

  • 가 선언 어떻게에 따라 유형이있는 변수,
  • 참조 (예를 들어, 참조 형의 값 가변) 형식을 갖는다
  • 객체()
,

변수의 값 (원시 변수가 아니라고 가정)이 참조입니다. 이 참조는 null이거나 변수의 유형과 양립 할 수있는 유형의 객체를 참조 할 수 있습니다.

그래서 위의 예 :

  • x의 유형 x의 값은 실행시
  • 해당 참조 타입 String의 객체를 참조하는 참조를이다 Object
  • 이다
+0

답변 해 주셔서 감사합니다. 그래서 당신은 컴파일 시간 동안 타입이 실행 시간 동안 참조가 가리키는 객체를 보완해야한다는 것을 항상 확인해야합니다. – krato

1
LinkedList<String> l1 = new LinkedList<String>(); 

여기에서 l1은

List<String> l2 = new LinkedList<String>(); 

LinkedList의

의 여기 (L2)는 LinkedList의 그를 포함하는 동안 List 인터페이스는 메소드가 포함되어 있지 않기 때문에

(L2)이 방법의 addFirst이없는 목록의 인스턴스입니다. 하지만 언제든지 코드에서 l2를 linkedList로 형 변환하고 addFirst() 메서드를 호출 할 수 있습니다.

0

목록 l2 = 새로운 LinkedList();

SuperClass 인스턴스 만 사용하는 방법이있는 경우 유용합니다. SubClassSuperClass이므로 SubClass의 인스턴스를 사용하고 SuperClass으로 처리 할 수 ​​있습니다.

그건 다형성입니다. 이 클래스를 사용하면 나머지 코드를 손상시키지 않고 클래스의 내부 구현을 변경할 수 있습니다.