java的类型识别问题

Holinfox 2006-05-10 02:56:47
我有一个Object对象,该对象原来所属的类型已经知道,但是类型是以字符串形式表达的。如何将这个Object转换为它原来所属的类型?例如,例如,我从容器中读出了一个对象,当然,该对象是Object类型的,根据getClass()方法,我可以知道,这个对象原来所属的类型(例如,它原来属于String类型),如何把这个object转换为它原来所属的类型(String类型)?
...全文
325 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
UnAgain 2006-05-11
  • 打赏
  • 举报
回复
get方法也可以这么写:
public boolean get(int index, Object[] obj){
Object e = list.get(index);
if (obj[0].getClass() == e.getClass()) {
// 或者 if (obj[0].getClass().isInstance(e)) {

obj[0] = e;
return true;
}
return false;
}
但是,这样就要求用户使用时必须初始化数组,象这样:
Integer[] i = new Integer[1];
i[0] = 0;
ml.get(0, i)

我没有办法从得到数组可容纳的元素的类型,好像是不可能的。所以创建一个空数组来作类型匹配检验:
Object ea = Array.newInstance(e.getClass(), 0);
if (obj.getClass() == ea.getClass()) {

另外,到目前为止,通过参数传递对象地址只能使用数组,所以我用数组作参数,而不是象最早的帖子中,使用引用作参数。
GALFORDD 2006-05-11
  • 打赏
  • 举报
回复
Class.isInstance(reference)
reference instanceof Object
reference.equals(reference)
UnAgain 2006-05-11
  • 打赏
  • 举报
回复
如果方便的话我们在线聊吧,比较实时
MSN: tl21cen@hotmail.com
UnAgain 2006-05-11
  • 打赏
  • 举报
回复
这是我能想到的最好的解决方案了。动态类型识别,数组传递对象


import java.util.ArrayList;
import java.lang.reflect.Array;

public class TestDynamicCast_1 {
static class MyList {
ArrayList list;

public MyList(ArrayList list) {
this.list = list;
}
public boolean get(int index, Object[] obj){
Object e = list.get(index);
Object ea = Array.newInstance(e.getClass(), 0);
if (obj.getClass() == ea.getClass()) {
obj[0] = e;
return true;
}
return false;
}
}
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<Object>();
list.add(Integer.valueOf(1));
list.add("Hello");
list.add(list);

MyList ml = new MyList(list);

Integer[] i = new Integer[1];
if (ml.get(0, i)) {
System.out.println(i[0]);
}

String[] s = new String[1];
if (ml.get(1, s)) {
System.out.println(s[0]);
}

ArrayList[] lists = new ArrayList[1];
if (ml.get(2, lists)) {
System.out.println(lists[0]);
}
}
}
Holinfox 2006-05-11
  • 打赏
  • 举报
回复
to:UnAgain

如果由用户来自己来转换的话,似乎也不容易,因为,如果容器中的对象比较多的话,用户也很难分清哪个是哪个,除非用户这样做:

if(userClass1.class.isInstance(o1)){
userClass1 uc = (userClass1)o1
}else {
if(userClass2.class.isInstance(o2)){
userClass2 uc = (userClass2)o2
}

...........

其中,userClass1,userClass2等是用户的类型 , o1 , o2是用户从容器中读出的对象。这样用户好像需要写上一堆的if...else...才可以,不方便使用,有没有其它的办法?
Holinfox 2006-05-11
  • 打赏
  • 举报
回复
我觉得,这个有点像检查点的问题,就是,用户先把一些中间结果先存起来,再在适当的时候恢复,只是这个恢复过程比较麻烦。
crazycy 2006-05-10
  • 打赏
  • 举报
回复
好像挺有用的;关注;

if (obj istanceof String) {
....
} else if (obj instanceof List) {
......
}
UnAgain 2006-05-10
  • 打赏
  • 举报
回复
这个问题只能由用户自己转换。对象存入容器之后,并没有失去类型信息,其类型信息仍然在其内部保留着。

因为你做的是一个通用类,你不可能知道用户到底会存入什么对象。并且你也不知道用户会用什么方法从中取得对象。除非使用参数作为输出:
定义方法:
class MyList extends ArrayList {
....
public boolean get(index id, Object obj){
ele = list.get(id)
if ( ele instanceof obj.getClass()) {
obj = ele;
return true;
} else {
return false;
}
}
}
然后,用户使用:
String s;
myList.get(1, s);
但这么做,一是java不提倡,另外,你给的信息也不够多。

所以,如果你只想给用户提供一个容器,到目前为止就足够了。
Holinfox 2006-05-10
  • 打赏
  • 举报
回复
我现在在做的是一个包,这个提供这样一个功能:用户可以调用包中提供函数把他自己的对象(有可能是任何对象)先保存起来,然后,在需要的时候又把存入的对象读取出来。因为用户要存入的对象的类型是不确定的,因此我用容器来实现(如ArrayList),这样才能存储各种类型,但现在面临一个问题:用户把它的对象存入容器后,就失去了类型信息(都变成Object类型了),因此读出来以后就是一个Object对象,而不是用户存进去之前的对象,如何把这个Object转化为用户刚存入前的类型呢?
UnAgain 2006-05-10
  • 打赏
  • 举报
回复
To: Holinfox()
具体问题具体对待。你要说一下,你转换类型之后要执行什么操作?这样才能回答你的问题。
chaosking 2006-05-10
  • 打赏
  • 举报
回复
用instanceof操作符写一堆if
zclgod 2006-05-10
  • 打赏
  • 举报
回复
if("String".equals(你的字符串)) {
(String)你的Object
} esle if("其他类型".equals(你的字符串)) {
(其他类型)你的Object




。。。。。。。。。。。。
Holinfox 2006-05-10
  • 打赏
  • 举报
回复
请大家注意,String类型只是举个例子,可能容器里还有许多其它类型,另外,以前的类型名是用字符串表示的,所以像这样:以前的类型 mm=(以前的类型)Object,好像不行。二楼和三楼的朋友的方法好像不可行。
真的没有其它办法吗?
lukan 2006-05-10
  • 打赏
  • 举报
回复
怎么说呢,总的来说这个是没有办法自动完成类型的转换的
你可能只能知道这个容器里总共只有可能有几种类型
然后就
swich(arrayList.getClass().getName().hashCode()){
case "String".hashCode():
......
qczl1224 2006-05-10
  • 打赏
  • 举报
回复
String str = (String)Object;
或String str = Object.toString();
qczl1224 2006-05-10
  • 打赏
  • 举报
回复
以前的类型 mm=(以前的类型)Object;

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧