2014-01-16 5 views
1

그래서 여기이 간단한 프로그램을 실행하기 위해 노력하고있어 :스택 -되지 않은/안전하지 않은 작업

import java.util.*; 

class StackDemo 
{ 
    public static void main(String[] args) { 
     Stack s = new Stack(); 
     s.push(5); 
     s.push("dog"); 
     System.out.print(s); 
    } 
} 

StackDemo.java 선택 해제 또는 안전하지 않은 작업을 사용합니다. 참고 : 자세한 내용은 -Xlint:unchecked으로 다시 컴파일하십시오. 프로세스가 완료되었습니다.

"[5, dog]" 인 예상 결과를 표시하지만 출력 작성 창에서 해당 메시지를 이해할 수 없습니다. 무엇이 잘못되었을 수 있습니까?

+0

당신이 원하는 : Object - 당신이 당신의 스택에 모두 5"dog"를 저장하고 싶은 유스 케이스가 실제로 존재하는 경우

, 당신은 둘 사이의 가장 큰 공통 분모와 스택을 정의해야합니다 스택에 정수 및 문자열 유형을 넣으려면? '5'와''개''사이에는 어떤 관계가 있습니까? –

+0

Stack 대신 Deque를 사용하는 것을 고려하십시오. Javadoc의 설명 : "Deek 인터페이스 및 그 구현에 의해,보다 완전하고 일관된 LIFO 스택 조작 세트가 제공됩니다.이 인터페이스는이 클래스보다 우선적으로 사용되어야합니다." – Puce

+1

자세한 내용을 보려면'-Xlint : unchecked'를 사용하여 컴파일을 시도 했습니까? –

답변

2

스택은 레거시 클래스이지만 경고는 사용자가 제네릭을 사용하지 않아 컴파일러가 올바른 유형을 추가했는지 여부를 확인할 수 없기 때문입니다.

실제 프로그램에서 유형을 혼합 했으므로 버그라고 생각합니다.

+0

위의 코드는 실제 프로그램이 아니며 처리해야 할 내용을 더 빠르게 보여주는 예제입니다. 대답을 주셔서 감사합니다. – user3026693

+0

왜 스택이 레거시 클래스입니까? 대신 무엇을 사용해야합니까? –

+0

스택은 1998 년 ArrayList 및 LinkedList로 크게 대체되었지만 ArrayDeque 또는 ConcurrentLinkedDeque가 2006 년 추가 된 것이 더 나은 선택입니다. –

5

Stack은 원할 경우 특정 유형의 객체 (예 : Stack<String>이 문자열 저장에 사용됨)를 사용할 수있는 일반 클래스입니다. 형식 지정자없이 맨손 클래스를 사용하는 것은 컬렉션의 형식 안정성을 상실하기 때문에 일반적으로 나쁜 습관으로 간주됩니다. 그래서

Stack<Object> s = new Stack<>();