자바에서 클래스 재사용 할 때 문제점입니다.

jang900824의 이미지

import java.util.*;
 
...생략
return (double)numberStack.poll();
...생략

위의 코드는 제가 만든 계산기 클래스의 일부분인데
numberStack은 LinkedList타입이고 저 안에는 숫자가 double형식으로, 혹은 연산자가 String 형식으로 저장되어 있습니다.
물론 안에 들어가면 object 형식으로 바뀌겠지만요.
문제는 원래 CUI형식으로 코드를 짰을 땐(프로젝트 메인 메서드가 CUI인 형태로 클래스를 새로 만들어 코드를 짰을 때)전혀 문제가 없었는데
GUI프로젝트를 새로 만들고 거기다가 저 클래스를 넣으니

'inconvertible type'
required: double
found: object

즉 바꿀 수 없는 타입이라고 에러가 뜨는 겁니다.
다른 프로젝트로 옮길 때 문제가 생겼나 싶어서 CUI형식의 프로젝트를 하나 더 만들어서 거기다가 복사 해 봤더니 그 때는 문제가 없었습니다.
GUI에서 일부 파일이 import되지 않았거나 하는거 같은데 무슨 문제일까요?

shint의 이미지

정리해보면.
- CUI 인지. CLI 인지. 둘다 있네요.
- 형변환을 하려는데. java.lang.* 이 자동 포함되지 않아서. 문제가 있을지도 모릅니다.
지피지기 자바2 장병주저 193p보면. java.lang은 자동으로 import 된다고 합니다.
그렇지만. String의 경우는 상속 받지 못하도록. final 선언어 되어 있다고 합니다.
그것이 관계가 있어서 일어난 현상이 아닌가 모르겠습니다.?? 한번 java.lang.추가해보는것도 좋다고 생각됩니다.

자바 클래스
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Number.html
http://docs.oracle.com/javase/1.5.0/docs/api/javax/rmi/CORBA/Util.html
 
이와 유사한 사례.
inconvertible types error with instanceof operator
http://www.coderanch.com/t/441425/java-programmer-SCJP/certification/inconvertible-types-error-instanceof-operator
https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870
http://stackoverflow.com/questions/4829576/javac-error-inconvertible-types-with-generics
 
instanceof operator
http://blog.naver.com/suehyuny21/40072289919
 
inconvertible types 오류 : main 코두 위치 순서. 파일 합치기 버그. 함수 철자가 틀린 경우.
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=67920447&qb=aW5jb252ZXJ0aWJsZQ==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=R7Yzoc5Y7t8ssZZjb/ossssssuK-294195&sid=ULvzoHJvLB8AAEEaDmk
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=67967875&qb=aW5jb252ZXJ0aWJsZQ==&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=R7Yzoc5Y7t8ssZZjb/ossssssuK-294195&sid=ULvzoHJvLB8AAEEaDmk
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=70336451&qb=aW5jb252ZXJ0aWJsZQ==&enc=utf8&section=kin&rank=3&search_sort=0&spq=0&pid=R7Yzoc5Y7t8ssZZjb/ossssssuK-294195&sid=ULvzoHJvLB8AAEEaDmk
 
자바 제너릭과 와일드 카드
http://www.iamscavenger.com/124
http://blog.naver.com/celdi77/60003405370
http://arabiannight.tistory.com/63
http://happystory.tistory.com/51
 
업 다운 캐스팅
http://blog.naver.com/killer10004/70115133864
http://geek.starbean.net/?p=160
 
linkedlist poll
http://alecture.blogspot.kr/2012/10/linkedlist.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/tgspg+(%EC%9E%90%EB%B0%94+%EA%B0%95%EC%A2%8C)
http://blog.naver.com/dangnagu2?Redirect=Log&logNo=140148304703

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jang900824의 이미지

하지만 이미 실험해 봤던 경우입니다. 물론 해결 안됐구요...
링크 들어가 보면서 알아보겠습니다. 감사합니다.

익명 사용자의 이미지

컴파일 에러 나는 것이 당연합니다. 안나는 것이 이상하네요.
LinkedList.poll() 또는 type parameter 없이 사용한 LinkedList.poll() 은 Object 타입의 객체를 반환합니다.
Object 를 int 나 double같은 primitive type 으로 cast하는 것은 불법입니다.
poll이 반환한 객체가 Double이라는 확신이 있으면 Double로 cast하면됩니다. 그러면 auto unboxing에 의해 double로 사용할 수 있습니다.

익명 사용자의 이미지

> LinkedList.poll() 또는 type parameter 없이 사용한 LinkedList.poll() 은 Object 타입의 객체를 반환합니다.

이 부분을 다음과 같이 수정합니다.

> LinkedList<Object>.poll() 또는 type parameter 없이 사용한 LinkedList.poll() 은 Object 타입의 객체를 반환합니다

jang900824의 이미지

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;
 
import java.util.*;
 
/**
 *
 * @author jang
 */
public class temp {
    private LinkedList afterOperatorStack=new LinkedList();
    public void start()
    {
        afterOperatorStack.add(4.8);
        afterOperatorStack.add("agaga");
        double result=(double)afterOperatorStack.poll();
        System.out.println(result);
    }
}

위의 실행문은 제가 컴파일러에서친 그대로를 올린 것입니다.
그리고 실행 결과는 4.8이 나왔습니다.
Object타입이 반환 되었지만 캐스팅에 의해 double 타입으로 바뀐 것입니다.
컴파일러도 문제를 제기하지 않았고 컴파일 결과도 정상이었습니다.

근데 GUI로 class파일을 넘겼을 땐 똑같은 코드임에도 불구하고

double result=(double)afterOperatorStack.poll();

에서 컴파일러가 컴파일 하기 전 코딩단계에서 빨간 밑줄을 그으며 오류라고 표시를 합니다.
오류 내용은 본문과 같고요.
java.lang.*;

를 추가 해 봐도 마찬가지였습니다.

그리고 타입을 지정 해 줄 수가 없는게 double 뿐만 아니라 String 타입도 같이 저장되기 때문입니다.
그래서 원래 클래스에선 두 타입을 혼합해서 썼습니다.

익명 사용자의 이미지

java7 에서부터는 합법이고, 그 이전에서는 불법입니다.
java7을 사용하고 계신 것 같으니 컴파일시에 -source 1.5 또는 -source 1.6 옵션을 주셔서 테스트해볼 수 있을겁니다.
아무 옵션도 없으면 -source 1.7 과 마찬가지이고, Object를 double로 캐스팅하는 것이 허용됩니다.
프로젝트 설정에서 컴파일러 옵션을 잘 살펴보세요. GUI 프로젝트에 -source 1.5 또는 -source 1.6 이 들어가 있을 가능성이 큽니다.

그리고, 한 collection에 두 타입을 같이 넣는 것은 좋은 디자인이 아닙니다.

enum TokenType {
OPERAND, OPERATOR
}

class Token {
TokenType type;
Object value;
}

같은 개념의 클래스를 만들어 사용하시는 것이 좋습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.