2012-03-29 4 views
1

(자바 사용하기) B- 트리 인 일반 클래스를 구현 중입니다. 사용자가 프로그램을 실행할 때 트리의 유형 (정수, 문자, 이중 또는 문자열)을 결정하는 인수를 제공 할 수 있습니다. 내 주요 방법은일반 클래스의 객체 만들기

는이 코드가 있습니다

// Get user input and split it into tokens 
// Tokens[1] = the type specified by the user 

if(tokens[1].equals("DOUBLE")) 
    BTree<Double> t = new BTree<Double>(); 

else if(tokens[1].equals("CHARACTER")) 
    BTree<Character> t = new BTree<Character>(); 

else if(tokens[1].equals("INTEGER")) 
    BTree<Integer> t = new BTree<Integer>(); 

else if(tokens[1].equals("STRING")) 
    BTree<String> t = new BTree<String>(); 

를하지만이 (가) if 문이있는 경우 컴파일러는 불평. 제거하면 잘 컴파일되고 실행됩니다./어떻게 해결할 수 있습니까? 사용자가 유형을 제공 할 수 있도록 제공되는 유형에 따라 트리가 생성됩니까? 감사. 여기

는 컴파일러 출력의 일부 :

C:\Users\User\Desktop>javac *.java 
Main.java:42: error: cannot find symbol 
BTree<Double> t = new BTree<Double>(); 
symbol: variable BTree 
location: class Main 

Main.java:42: error: cannot find symbol 
BTree<Double> t = new BTree<Double>(); 
symbol: variable Double 
location: class Main 

Main.java:42: error: cannot find symbol 
BTree<Double> t = new BTree<Double>(); 
symbol: variable t 
location: class Main 

.. 이상 존재하지만 유형

+2

컴파일러 로그를 제공 할 수 있습니까? – mishadoff

+0

질문에 편집했습니다 : – Tim

+0

질문 제목 : "추상적 인 클래스의 객체 만들기"하지만 실제로는 다른 것을 요구하고 있습니다. – anubhava

답변

1

if 문에서 변수 tif의 컨텍스트에서만 정의되며 컴파일러에서는 해당 컨텍스트 외부에서 해당 변수를 인식하지 못합니다.
변수 tif 문 앞에 정의하십시오. 이 유형 T 모든 종류의 동일한 기능을 실체화 할 것 때문에

BTree<?> t = null; 
if(tokens[1].equals("DOUBLE")) { 
    t = new BTree<Double>(); 
} 
else if(tokens[1].equals("CHARACTER")) { 
    t = new BTree<Character>(); 
} 
else if(tokens[1].equals("INTEGER")) { 
    t = new BTree<Integer>(); 
} 
else if(tokens[1].equals("STRING")) { 
    t = new BTree<String>(); 
} 
// now you can use your 't' 
+0

cool thanks :) 이것도 가능합니다 .. – Tim

+0

@Tim 한 라이너의 경우에도 각 if 문에 대괄호를 삽입하는 습관을 만들어야합니다. – jb10210

0

삽입 중괄호 각각 유사한 반복된다 :

if(tokens[1].equals("DOUBLE")){ 
    BTree<Double> t = new BTree<Double>(); 
} 
else if(tokens[1].equals("CHARACTER")){ 
    BTree<Character> t = new BTree<Character>(); 
} 
else if(tokens[1].equals("INTEGER")){ 
    BTree<Integer> t = new BTree<Integer>(); 
} 
else if(tokens[1].equals("STRING")){ 
    BTree<String> t = new BTree<String>(); 
} 

또는 계산하기 전에 나무를 선언하십시오 :

BTree<? extends Object> t = null; 
if(tokens[1].equals("DOUBLE")) 
    t = new BTree<Double>(); 
else if(tokens[1].equals("CHARACTER")) 
    t = new BTree<Character>(); 
else if(tokens[1].equals("INTEGER")) 
    t = new BTree<Integer>(); 
else if(tokens[1].equals("STRING")) 
    t = new BTree<String>(); 
+2

이렇게하면 컴파일 될 것이지만 나중에 't'를 공유 방식으로 사용하는 것은 어렵습니다. 근본적인 문제는 각't'가 다른 유형이라는 것입니다. –

+0

와우이 작품! 덕분에 매우 간단했습니다 ... – Tim

+0

@JeffFoster 각't'는 다른 유형이 아니며, 런타임시 모두 동일한 유형입니다. – jb10210

1

귀하의 BTree<T> 클래스는 추상적해서는 안됩니다.

당신이 T의 다른 유형에 대한 특정 기능이 필요한 경우, 당신도

class CharacterBTree extends BTree<Character> 

을 구현하기 위해 필요하거나 또한

BTree<Character> t = new BTree<Character>() { 
    ... 
}; 

처럼 즉석에서 그것을 할 것; 그래서 당신의 코드는

BTree<?> t = null; 
if ("char".equals(whatever)) { 
    t = new BTree<Character>(); 
} else if { 
    ... 
} 
0

내가, 어쩌면 당신이 필요로하는 솔루션이 아니다 (대소 switch 문을 사용하십시오 mishandoff 말했듯이, 로그를 보는 것은 약간의 도움이 될 수됩니다의 경우의 외부에서 BTree<T> t 변수를 선언

switch(tokens[1]) { 
    case "DOUBLE" : BTree<Double> t = new BTree<Double>(); break; 
    .... 
    .... 
} 
0

당신이 작동하지 않습니다

if (tokens[1].equals("DOUBLE")) 
    BTree<Double> t = new BTree<Double>(); 
else if (tokens[1].equals("CHARACTER")) 
    BTree<Character> t = new BTree<Character>(); 
// etc. 

t.doStuff(); 

같은 것을하려고하는 경우 : 단지 논리적 인 관점에서) 더. 첫째, t 변수는 if 문 안에서만 유효하고 다른 변수는 다른 코드 경로를 따라 다른 정적 유형을 가질 수 없기 때문에 두 번째입니다.

당신은

BTree<?> t; 
if (tokens[1].equals("DOUBLE")) 
    t = new BTree<Double>(); 
else if (tokens[1].equals("CHARACTER")) 
    t = new BTree<Character>(); 
// etc. 

같은 뭔가를 할 수 그러나 당신이 t에 저장된 항목과 유용한 아무것도 할 수 없습니다 이후 때문에이 트리 무엇을 모르는 다음 코드. 이것은 구문 문제가 아닌 근본적인 디자인 문제입니다.

인터페이스를 만들 수 있습니다 - ValueHolder으로 전화를 걸어 트리의 값에 어떤 작업을해야하는지 정의 할 수 있습니다. 그런 다음 DoubleHolder, CharacterHolder 등과 같은 클래스를 정의하십시오.이 클래스는 ValueHolder 인터페이스를 구현합니다.

BTree<? extends ValueHolder> t; 
if (tokens[1].equals("DOUBLE")) 
    t = new BTree<DoubleHolder>(); 
else if (tokens[1].equals("CHARACTER")) 
    t = new BTree<CharacterHolder>(); 
// etc. 

을하고 그 이후, 당신은 트리에서 항목을 검색 할 수 있고 그래서 당신은 그 인터페이스에서 제공하는 방법 중 하나를 호출 할 수 있습니다 유형 ValueHolder이 될 것입니다 : 그럼 당신은 쓸 수 있습니다.