C#里面object类型怎么list转换成object数组数组

博客分类:
闲来无事,想要用目前的Java技术模拟一个对象数据库。最初只是停留在很简单的构想,单用户的,本地的,仅仅是为了实现一些纯对象化的数据库操作:
public interface DataBase
public &T& T[] select(Filter&T& filter);
public &T& void insert(T t);
public int update(Filter&T& filter, Updater&T& handler);
public &T& int delete(T t);
其中,Filter和Updater分别是两个接口,处理查询子句和更新子句。
public interface Filter&T&
public boolean where(T obj);
public interface Updater&T&
public void set(T obj);
这么设计的目的是以一种对象化的方式处理数据,把数据库的操作和业务流程无缝的结合在一起。我说过,这只是我的一个练习,因此请仅把它看成是练习就好。数据库的对象容器用了一个泛型的List,里面可以包含任何对象。
然而在select方法的时候,碰到了一些问题。因为它要返回的是T[]类型结果,而由于T是泛型,在List 的toArray时,仅能生成Object[]类型的数组,与需求有差异。
@SuppressWarnings("unchecked")
public &T& T[] select(Filter&T& filter)
Collection&T& c= new ArrayList&T&();
for (Object obj : pool) {
if (filter.where(t)) c.add(t);
} catch (Exception ex) {
// 到现在都OK
return c.toArray(); // 不OK,返回类型为Object[],与结果不符
return (T[]) c.toArray(); // 不OK,仍返回 Object[],ClassCastException
return c.toArray(new T[0]); // 不OK,编译错误。
首先要解释一下为什么return c.toArray(new T[0]); 不能通过编译。因为据Java官方所说,为了向旧版本兼容,Java的泛型只是存在于编译期,其目的是编译期的源代码正确性校验,变成了.class之后所有泛型内容全部被抛弃。所以,new T[0]这种写法在运行期是不可能有意义的,因为没有T的具体定义。
加@SuppressWarnings("unchecked")的原因是T t = (T)语句。没有想到更好的办法做泛型的类型比较,用这种方法最直接。不过可能会产生ClassCastException,所以一旦发生转换错误,只是简单地继续处理下一个元素。若有其它解决方案也请能不吝赐教,这里谢过。
现在,回到问题上来:怎么实现这个泛型的数组转换呢?
我这里有一个伪解决方案。就是从结果集合中取一个值出来,然后创建这个值类型的数组,见下:
@SuppressWarnings("unchecked")
public &T& T[] select(Filter&T& filter)
Collection&T&
Iterator&T& it = c.iterator();
if (it.hasNext()) {
T[] tt = (T[]) Array.newInstance(it.next().getClass(), c.size());
return c.toArray(tt);
说这是个伪解决方案的原因是集合中的值并不就等于是T,有可能是T的子类。若集合中所有元素都是一个类别倒还好说,怕只怕有些元素又是子类的子类(孙类)。那么假设碰巧集合中第一个拿到的就是孙类,那么tt实际是孙类的数组,这样对于包含子类对象的集合执行toArray操作的时候就会出现ArrayStoreException。
好了,在暂时不考虑这个“伪”字的情况下,这里举个使用的例子:
public static void main(String[] args)
DataBase db = new DataBaseImpl();
db.insert("Hello, ");
db.insert(" this ");
db.insert(new Integer(3));
db.insert("world!");
String[] ss = (db.select(new Filter&String&() {
public boolean where(String obj)
return (obj.trim().length() & 4);
for (String s : ss)
System.out.println(s);
======== 补充========
春节休假在家,偶尔看了一下论坛。结合下面的评论并思考了一下,目前采用通过传入的Filter获得泛型类的方法:
import java.lang.reflect.*;
import java.util.*;
public class Container {
private Collection&Object& container = new ArrayList&Object&();
public void add(Object obj) {
container.add(obj);
@SuppressWarnings("unchecked")
public &T& T[] select(Filter&T& filter)
Type[] types = filter.getClass().getGenericInterfaces();
if (types != null && types.length & 0) {
clazz = ((Class) ((ParameterizedType) types[0])
.getActualTypeArguments()[0]);
Collection&T& c = new ArrayList&T&();
for (Object o : container) {
if (clazz.isInstance(o) && filter.where((T) o))
c.add((T) o);
T[] tt = (T[]) Array.newInstance(clazz, c.size());
return c.toArray(tt);
public static void main(String[] args) {
Container c = new Container();
c.add("Hello");
c.add("world");
c.add("I");
c.add("love");
c.add("you");
c.add(new Integer(4));
c.add("ever");
String[] list = c.select(new Filter&String&() {
public boolean where(String s) {
return (s.length() & 3);
for (String s : list)
System.out.println(s);
interface Filter&T& {
boolean where(T t);
论坛回复 /
(27 / 14024)
c.toArray((T[])new Object[0] ); 就可以了.
发现我前些天用的方法有问题, 报异常了:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.O
at serializable.TryGeneric.main(TryGeneric.java:16)
实验用代码如下:
import java.util.ArrayL
import java.util.D
import java.util.L
public class TryGeneric {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Date now = new Date();
List list = new ArrayList();
list.add(now);
Date[] results = (Date[]) convertToArray(list);
@SuppressWarnings("unchecked")
private static &T& T[] convertToArray(List&T& list) {
return list.toArray((T[])new Object[0] );
同意wendong007的看法。
泛型的出现是为了改进使用object类型时转换类型的效率。
这么的写法不如直接用实际的类型或是Object[]和List来的好一些。
Java里泛型的出现不是为了源码“更安全”么?执行效率应该没有多少区别才对。你看对这样的一个测试代码:
import java.util.ArrayL
public class TestGeneric {
public static void main(String[] args) {
private static void foo1() {
ArrayList list = new ArrayList();
MyObject obj = new MyObject();
list.add(obj);
MyObject objref = (MyObject)list.get(0);
private static void foo2() {
ArrayList&MyObject& list = new ArrayList&MyObject&();
MyObject obj = new MyObject();
list.add(obj);
MyObject objref = list.get(0);
class MyObject { }
其中的foo1()和foo2()编译出来是完全一样的,都是这样:
0: new #4; //class java/util/ArrayList
4: invokespecial #5; //Method java/util/ArrayList."&init&":()V
7: astore_0
8: new #6; //class MyObject
12: invokespecial #7; //Method MyObject."&init&":()V
15: astore_1
16: aload_0
17: aload_1
18: invokevirtual #8; //Method java/util/ArrayList.add:(Ljava/lang/O)Z
22: aload_0
23: iconst_0
24: invokevirtual #9; //Method java/util/ArrayList.get:(I)Ljava/lang/O
27: checkcast #6; //class MyObject
30: astore_2
31: return
注意在标号为27的那条指令,那个就对应着foo1()的强制类型转换,而foo2()使用了泛型之后隐式的包含了这个操作。
我也觉得干脆不返回数组比较好。其实很多时候数组用起来都很尴尬,与Iterable&E&也不兼容。
javatar 写道
把Filter的check()改成where()看起来会更符合SQL标准,呵呵
&
我是尽量参照楼主原来的命名
吼嘞吼嘞,已经啊补充过嘞……
的确where更符合品鉴的口味。呵呵,采纳了。
那你可以试下下面这种方法
Class&clazz&=&(Class)((ParameterizedType)&getClass().getGenericSuperclass()).getActualTypeArguments()[0]; &&
clazz.isInstance(obj);&&Class clazz = (Class)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
clazz.isInstance(obj);
这种做法是不合适的,这么做是把当前对象的泛型取出来,但当前对象是容器,不是容器内的对象,更不是T。可以注意到,这段代码里面一丝一毫都没提到过T。因此,肯定是不能解决我提到的问题的。
& 上一页 1
浏览: 55633 次
来自: 上海
视界这个概念终于搞清楚了,谢谢!
写了一个更通用的方法:ObjectUtils.cast。目的是 ...
谢谢分享。正在找这个!
第二版什么时候出啊
xpf7622 写道haixu.huang@live @前的名 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'c# 数组间转化 int[] string[] object[] - CSDN博客
c# 数组间转化 int[] string[] object[]
&int[] d = new int[2]{1,2};
object[] b = (object[])ArrayList.Adapter((Array)dd).ToArray(typeof(object));
string[]&s = Array.ConvertAll(d, new Converter&int, string&(StrToInt));
&private static string StrToInt(int str)&{&&&&&&&return str.ToString();&}
string[]&s = Array.ConvertAll&int, string&(d, Convert.ToString);
一般用方法三,但不能转object[]数组,如果转object[]用方法一。
本文已收录于以下专栏:
相关文章推荐
1.(int) 适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型)。
2. int.Parse(string sParameter) 是个构造函数,参数类型只支持stri...
要序列化的对象
返回存放序列化后的数据缓冲区
Serialize(objec...
今天看代码时候的发现的小问题,随手记录一下。 参数obj是个无法确定大小的bject[]数组类型,而且object[]不支持foreach来遍历用以下办法可以解决         //obj是无法确定...
       可以通过向下转型来获得,但是不知道为什么包类异常,最后我采用的方法如下:
Object l = it.remove(-1, 1, 3);
String[] newarr...
package com.
public class ObjectToStringDemo {
* @param args
public stat...
在做通信编程的时候,数据发送多采用串行发送方法,实际处理的时候多是以字节为单位进行处理的。在C/C++中 多字节变量与Byte进行转化时候比较方便 采用UNION即可
废话少说看示例:
C# double float int string 与 byte数组 相互转化
在做通信编程的时候,数据发送多采用串行发送方法,实际处理的时候多是以字节为单位进行处理的。在C/C++中 多...
android Parcelable 带有数组的对象如何序列化 String[] Long[] int[] Object[]
这个是Activity:
package com.exampl...
转自:/dengw009/archive//2114258.html
using System.Col...
C# 数组从零开始建立索引,即数组索引从零开始。C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。
声明数组时,方括号 ([]) 必须跟在类型后面,...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)本帖子已过去太久远了,不再提供回复功能。(json)object
转换 - CSDN博客
(json)object
字符串&&object& (json)object&& array&转换
var testArray=new Array();
testArray.push(&testA&);&&&&&&&&&&&&&&&&&&&&&&&& //testArray中真的有值了,
testArray.push(&testB&);
testArray.push(&testC&);
<(&11:&&#43;testArray.push(&testD&));&&&&&&&&& //push()& return Count 4
<(&12:&&#43;testArray); &&&&&&&&&&&&&&&&&&&&&&&//&& return [*,*,*,*] --数组
<(&13:&&#43;JSON.stringify(testArray));&&&&&&& //&&return [*,*,*,*] --字符串
//toLocaleString() 、toString() 、valueOf() 等同与 join(',')方法
var t1=testArray.toString();
<(&14:&&#43;t1);&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&//
var t2=testArray.join('*');
<(&15:&&#43;t2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //
//push 是真正的压栈,数据会放到array中去。
//concat 不会把数据方法数组中去,只表示 合并多个数组 的功能,
//array1.concat(&ss&) 后,array1中不会有ss这个&#20540;。
var testArray=new Array();
testArray.push(&testA&);&&&&&&&&&&&&&&&&&&&&&&&& //testArray中真的有&#20540;了,
testArray.push(&testB&);
testArray.push(&testC&);
<(&11:&&#43;testArray.push(&testD&));&&&&&&&&& //push()& return Count 4
<(&12:&&#43;testArray);&&&&&&&&&&&&&&&&&&&&&&& //&& return [*,*,*,*] --数组
<(&13:&&#43;JSON.stringify(testArray));&&&&&&& //&&return [*,*,*,*] --字符串
//toLocaleString() 、toString() 、valueOf() 等同与 join(',')方法
var t1=testArray.toString();
<(&14:&&#43;t1);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //
var t2=testArray.join('*');
<(&15:&&#43;t2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //
//push 是真正的压栈,数据会放到array中去。
//concat 不会把数据方法数组中去,只表示 合并多个数组 的功能,
//array1.concat(&ss&) 后,array1中不会有ss这个&#20540;。
var testArray2=new Array();
testArray2.concat(&testA&);&&&&&&&&&&& &&&&&&&//testArray2中没有实际
testArray2.concat(&testB&);
testArray2.concat(&testC&);
<(testArray2.concat(&testD&));&&&&&&&&&&&&&& //concat& return [&testD&]
<(testArray2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //return []
转Object__Object转String__array转string
Stringàobject& JSON.parse();&& eval(&(&&#43; strA &#43;&)&);
Arrayàstring&& JSON.stringify();
Objectàstring& JSON.stringify();
function json(){
var jsonObj = { id: '01', name: 'Tom'};&& //define an Object&&&&&&&& 定义一个object类型
<( typeof(jsonObj));&&&&&&&&&&& //Show the define type
//JSON需要引用类库
varstrJsonObj=JSON.stringify(jsonObj);&&&//Object change to string& 将object转换为string类型
<(strJsonObj);&&&&&&&&&&&&&&&&& //show the result
//eval不需要引用类库
var strJsonObj2=eval(&(&&#43;strJsonObj &#43;&)&); //string change to Object 将string 转换成 object类型
<(strJsonObj2);&&&&&&&&&&&&&&&&& //show the result
var jsonString ='{&id&:&01&,&name&:&Tom&}';//define astring
<(typeof(jsonString));&&&&&&&&&& //show type
var obj=JSON.parse(jsonString);&&&&&&&&&& &&//change string to& object
<(obj.id);&&&&&&&&&&&&&&&&&&&&&& //show a member of theobject
&&&&&&&&&&& varcodeValList =
new Array();
&&&&&&&&&&& varobj =
new Object();
&&&&&&&&&&& obj.VehicleId = $(&#VehicleId&).val();
&&&&&&&&&&& obj.GpsInstruction = 1;
&&&&&&&&&&& codeValList =codeValList.concat(obj);
// concat函数返回一个新数组,新数组是由多个数组组合而成的。
&&&&&&&&&&& posParam = JSON.stringify(codeValList);//JSON.stringify
参数可以使array
转& string
toLocaleString() 、toString() 、valueOf() 等同月 join(',')
split(‘,’)
var stringA=&123,,999&;
var arrA=new Array();
arrA=stringA.split(',');
&script type=&text/javascript&src=&/jquery-1.10.1.js&&&/script&
&script type=&text/javascript&src=&/Json2.js&&&/script&
&!-- need use the file of json2.js ,thencould use these method JSON.JSON.parse --&
&&script type=&text/javascript&&
function json(){
var jsonObj = { id: '01', name: 'Tom'};&& //define an Object&&&&&&&& 定义一个object类型
<( typeof(jsonObj));&&&&&&&&&&& //Show the define type
//JSON需要引用类库
var strJsonObj=JSON.stringify(jsonObj);&&& //Object change to string& 将object转换为string类型
<(strJsonObj);&&&&&&&&&&&&&&&&& //show the result
//eval不需要引用类库
var strJsonObj2=eval(&(&&#43;strJsonObj &#43;&)&); //string change to Object 将string 转换成 object类型
<(strJsonObj2);&&&&&&&&&&&&&&&&& //show the result
var jsonString ='{&id&:&01&,&name&:&Tom&}';//define astring
<(typeof(jsonString));&&&&&&&&&& //show type
var obj=JSON.parse(jsonString);&&&&&&&&&&&& //change string to& object
<(obj.id);&&&&&&&&&&&&&&&&&&&&&& //show a member of theobject
var testArray=new Array();
testArray.push(&testA&);&&&&&&&&&&&&&&&&&&&&&&&& //testArray中真的有&#20540;了,
testArray.push(&testB&);
testArray.push(&testC&);
<(&11:&&#43;testArray.push(&testD&));&&&&& &&&&//push()&return Count 4
<(&12:&&#43;testArray);&&&&&&&&&&&&&&&&&&&&&&& //&& return [*,*,*,*] --数组
<(&13:&&#43;JSON.stringify(testArray));&&&&&&& //&&return [*,*,*,*] --字符串
//toLocaleString() 、toString() 、valueOf() 等同与 join(',')方法
var t1=testArray.toString();
<(&14:&&#43;t1);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //
var t2=testArray.join('*');
<(&15:&&#43;t2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //
//push 是真正的压栈,数据会放到array中去。
//concat 不会把数据方法数组中去,只表示 合并多个数组 的功能,
//array1.concat(&ss&) 后,array1中不会有ss这个&#20540;。
var testArray2=new Array();
testArray2.concat(&testA&);&&&&&&&&&&&&&&&&&& //testArray2中没有实际
testArray2.concat(&testB&);
testArray2.concat(&testC&);
<(testArray2.concat(&testD&));&&&&&&&&&&&&&& //concat& return [&testD&]
<(testArray2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //return []
var stringA=&123,,999&;
var arrA=new Array();
arrA=stringA.split(',');
var data=&{\
{name:'1',value:'0'},\
{name:'6101',value:'北京市'},\
{name:'6102',value:'天津市'},\
{name:'6103',value:'上海市'},\
{name:'6104',value:'重庆市'},\
{name:'6105',value:'渭南市'},\
{name:'6106',value:'延安市'},\
{name:'6107',value:'汉中市'},\
{name:'6108',value:'榆林市'},\
{name:'6109',value:'安康市'},\
{name:'6110',value:'商洛市'}\
<(typeof(data));
vardataObj=eval(&(&&#43;data&#43;&)&);//转换为json对象
<(typeof(dataObj));
var a=json();
本文已收录于以下专栏:
相关文章推荐
Newtonsoft.Json下类...
Newtonsoft.Json.JsonConvert.
Newtonsoft.Json.JsonConvert...
添加引用&#160;
using Newtonsoft.Json.L
using Newtonsoft.J
using System.Collections.G
1、&#160; 解决Json对象互转的过程
2、&#160; 遇上时间转换的问题
3、&#160; 解决时间格式化的问题
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 原先一直做CS的开发,对Json了解不多,最近转...
在使用asp.net 2.0 beta 2 开发项目的过程中,碰到了将对象数组绑定到GridView的数据源上,但是使用排序的时候,却发现GridView并不提供对对象数组的支持,而在微软的官方网站上...
要序列化的对象
返回存放序列化后的数据缓冲区
Serialize(objec...
* JSON对于javascript来讲就相当于一个对象或者包含多个对象的list
window.onload = function()
&#160; &#160; &#160; &#160;可以通过向下转型来获得,但是不知道为什么包类异常,最后我采用的方法如下:
Object l = it.remove(-1, 1, 3);
String[] newarr...
PHP 将json的stdClass Object转成数组array 方法二
原来发的有个方法一的函数:&#160;http://blog.csdn.net/Mad_Geek/article/details...
JSON(JavaScript Object Notation): 是一种轻量级的数据交换格式
一、JSON建构有两种结构:对象和数组
1、对象:对象在js中表示为“{}”扩起来的内容,数...
JSON(JavaScript Object Notation): 是一种轻量级的数据交换格式
一、JSON建构有两种结构:对象和数组
1、对象:对象在js中表示为“{}”扩起来的内容,数...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 object类型转换为数组 的文章

 

随机推荐