2015-02-01 3 views
-3

Java List (및 Collection)는 메소드 구현 (add(), get())을 가지고 있으므로 어떻게 인터페이스가 될 수 있습니까? 내가 기대 : Java List는 구현 된 메소드가있는 인터페이스입니까?

List <Integer> nums = ArrayList <Integer>(); 
nums.add(5); 

가 추가() (인터페이스 인) ArrayList를하지 목록에 구현해야하기 때문에 위의 코드에 오류가있을 것이다 그러나 그런 경우가 아니라고, 코드가 잘 작동

. 누군가 설명 할 수 있습니까?

+3

"List (Collection)도 메서드 구현을 가지고 있습니다. (add(), get()') *"우리에게 보여 줄 수 있습니까? (BTW, 선언! = 구현)? 또한 Java 8 인터페이스에는'기본 메소드 (http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html) '이 있지만'List'에서'add()'와'get() '그들 중 하나가 아닙니다. – Pshemo

+4

인터페이스가 실제로 무엇인지 혼란스러워합니다. – Dave

+0

목록에 구현이 없습니다. 그렇지 않으면 List 을 작성할 수 있습니다. nums = List (); 대신 (작동하지 않을 것이다). – DuKes0mE

답변

2

이것은 실제로 작동중인 다형성입니다. ArrayList은 -이므로 변수 List에 할당 할 수 있습니다.

인터페이스는 인터페이스를 구현하는 모든 클래스의 계약을 정의합니다. 메소드를 구현하지 않습니다 (경고 : Java 8에서 변경됨).

변수 numsList이지만 구체적인 유형은 할당으로 인해 ArrayList입니다. 런타임에서는이 형식을 다형성으로 처리하므로 은 에 저장된 add을 동적으로 바인딩합니다. 즉 ArrayListadd 메서드가 호출됩니다.

The Java Tutorials > Polymorphism과 같은 섹션의 인터페이스 페이지를 읽는 것이 좋습니다. 여기 (오픈 JDK 소스 코드를) 볼 수 있듯이

0

는 : http://www.docjar.com/html/api/java/util/List.java.html

목록 없는 구현하는 인터페이스입니다. 이 인터페이스를 구현하는 ArrayList 또는 다른 List를 선언해야합니다.

+0

소스 코드를 볼 필요가 없습니다. Javadc이 알려줍니다. – EJP

+0

@EJP 사실입니다. 나는 OP가 어느 목록에 실제 구현을했다고 주장했는지 확실하지 않았습니다. – DuKes0mE

1

interface이 무엇인지, 또는 적어도 어떻게 사용하는지 다소 혼란스러워 할 것 같습니다. Java의 interfaceimplements 인터페이스가 제공해야하는 클래스 (또는 abstract)의 메소드 서명 세트를 정의합니다. ArrayListList 인터페이스를 구현하는 클래스 중 하나입니다.

List<Integer> nums = ArrayList<Integer>() 

당신은 List의 모든 메소드를 구현 ArrayList의 인스턴스를 생성하고, List를 구현하는 객체를 보유 할 수있는 변수에 할당 : 다음을 수행합니다. 즉, nums을 사용하는 경우 List에 의해 노출 된 메소드에만 액세스 할 수 있습니다. 그러나 실제로 이라는 메서드는 입니다.

Java는 interfaces을 사용하도록 권장합니다. 특정 상속 체인에 바인딩되어 있지 않기 때문입니다. 다음과 같은 방법 서명을 고려하십시오

public <T> void foo(List<T> input) 
public <T> void bar(ArrayList<T> input) 

List를 구현 무엇을 할 수 foo 방법; ArrayList 또는 LinkedList과 같은 표준 라이브러리 객체 중 하나 일 수도 있고 표준 List 작업 외에도 완전히 다른 기능을 제공하는 사용자 정의 클래스 일 수도 있습니다.이렇게하면 훨씬 더 유연 해집니다. foo은 단순히 보이는 개체가 List처럼 보이지만 실제로 그 개체가 무엇인지 신경 쓰지 않는다고 말하는 것입니다. 한편, bar 방법은 ArrayList을 직접 사용합니다. 나중에 다른 컬렉션을 사용하려는 경우 ArrayList 또는 ArrayList까지만 확장 할 수 있으므로 사용할 수 없습니다.

0

상속에 대해 공부해야합니다. List는 구현을 포함하지 않는 인터페이스입니다. 그러나 ArrayList에는 List 인터페이스의 모든 구현이 포함되어 있습니다.

nums.add (5)를 호출하면 List.add() 메서드가 호출되지만 실제로는 백그라운드에서 ArrayList.add (5) 메서드가 호출됩니다. 즉 상속

확인이의 비밀 : http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

1

인터페이스는 계약이며, 그 뒤에 어떤 구체적인 구현이있을 보장됩니다. 예를 들어 있습니다 (List 인터페이스에 의해 지정된 계약을 이행하지만, 모두 ArrayListLinkedList)

List<Integer> nums = ArrayList<>(); 

또는 그들은 그들의 내부 구현의 측면에서 차이가

List<Integer> nums = LinkedList<>(); 

를 사용할 수 있습니다. 마지막으로, Java 8+ interface (s)은 default methods 일 수 있습니다. 코드

List <Integer> nums = ArrayList <Integer>(); 
nums 기준에

실제 객체 ArrayList 인스턴스 될 정도로 방법

0

본체는, 기준 (이 late or dynamic binding라고한다)에 의해 유지 대상물의 실제 유형에 따라 (런타임) 동적로드 클래스이므로 add/get 코드는 ArrayList에서로드됩니다. 이 ArrayList이 (몸없이) 모든 추상적에 대한 몇 가지 구현을 포함 할 것을 알고 있기 때문에

List 실제로 get() 방법의 구현하지만 컴파일러 문제가되지 않습니다

nums.add(5); 

를 호출이 없습니다 방법은 List 인터페이스입니다.

1

implements List은 클래스에 인터페이스 List에 선언 된 모든 메소드가 있다는 약속입니다. 객체에서 필요한 것이 모두 List 메쏘드라면, 그 클래스가 List을 구현하는 한 실제로 어떤 클래스 이건 상관 없습니다.

List nums = new ArrayList();numsList 참조라고 선언합니다. 즉, 이제까지 가리키는 모든 객체는 List을 구현하는 클래스의 인스턴스 여야하므로 List이 선언하는 모든 메서드가 있습니다.

nums.add(5);List을 구현해야하기 때문에 nums 개체가 제공해야하는 add 메서드를 사용합니다.