자바 다형성에 관한 질문 있습니다(소스가 약간 깁니다^^:)
소리
import java.io.*;
public class f_input implements Serializable{
String name;
String jumin;
String tel;
String addr;
public static transient BufferedReader in;
static
{
in = new BufferedReader(new InputStreamReader(System.in));
}
public f_input() throws IOException
{
System.out.print(name = );
name = in.readLine();
System.out.print(jumin = );
jumin= in.readLine();
System.out.print(tel = );
tel = in.readLine();
System.out.print(addr = );
addr = in.readLine();
}
public void disp()
{
System.out.print(name+\t);
System.out.print(jumin+\t);
System.out.print(tel+\t);
System.out.print(addr+\t);
}}
=================================================================================
import java.io.*;
import java.util.*;
public class f_main
{
public static void main(String args[]) throws IOException,ClassNotFoundException
{
//f_input im = new f_input();//File dir = new File(c:\\f);
//dir.mkdir();
File file = new File(c:\\aaa.txt);
Vector vc = new Vector();
if(file.exists())
{
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
vc = (Vector)ois.readObject();
ois.close();
}//end of ifwhile(true)
{
System.out.print(1.Input friend information 2.print all friend 3.end= );
int x = System.in.read()-48;
System.in.read();
System.in.read();
if(x == 1)
{
f_input f = new f_input();
vc.add(f);
System.out.println(you have an friend now);
}
else if(x == 2)
{
for(int i = 0; i vc.size();i++)
f_input im = (f_input) vc.elementAt(i); ==에서 에러가 발생합니다.
// im = (f_input)vc.elementAt(i);
im.disp();
}
else if(x ==3)
{
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(vc);
oos.close();
System.exit(0);}}// end of while
}//end of main
}==============
위의 소스는 친구를 벡터에 추가하고 다시 불러들여서 보는하는 기능입니다.
근데 책 보고 그대로 따라 햇는데도 불구하고 오류가 나오고
그리고 이해가 않되는 구분이 있습니다.
vc = (Vector)ois.readObject();
f_input im = (f_input) vc.elementAt(i);
왜 이렇게 하는지 이해를 못하겠습니다.
백터는 그냥 백터로 쓰면 않되는지~~
-
잇힝
윗님 말씀대로 자바가 제공하는 컬렉션 라이브러리는 최대한의 범용성을 위해 모든 객체를 담을 때 java.lang.Object 타입으로 저장합니다. 이로인해 컬렉션에 담겨 있을 때는 객체의 원래의 타입이 숨겨질 수 밖에 없습니다. 그리고 꺼낼 때는 다운캐스팅을 하여 원래의 객체 타입으로 사용하게 되지요. JavaDoc을 보시면 Vector 클래스가 제공하는 elementAt() 메소드의 리턴 타입이 java.lang.Object임을 확인하실 수 있을겁니다
-
에다
위와 같은 작업을 복원화또는 다운캐스팅이라고 합니다.
소스를 전체적으로 보진 않았지만, 어떤 컬렉션에 데이터를 저장할 때
잠시동안 모든 객체들의 대모(大母)격인 Object class로 업캐스팅 됩니다.
업캐스팅(상위 클래스화된다)된 상태로 저장이 됩니다.-- 사실 이것도 다형성입니다.
그렇게 저장된 데이터를 꺼내어 쓸려고할때는
저장할 때모습이 아니라 Object형태의 객체가 됩니다.
이대로 쓸수가 없겠죠..
그래서 복원화(다운캐스팅)을 해주고 원래