泛型中 基类和子类 怎么转换?

ayun00 2013-08-07 06:39:31
基类 A 子类 B

基类方法

public List<A> getlist()
{
return;
}

List<B> list = base.getlist();


怎么达成 上面的目标?
...全文
580 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayun00 2013-08-12
  • 打赏
  • 举报
回复
如果有 in out 要怎么写呢?
裸奔的蜗牛 2013-08-09
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
[quote=引用 2 楼 lizhi3186575 的回复:] 这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
引用 4 楼 ayun00 的回复:
[quote=引用 2 楼 lizhi3186575 的回复:] 这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
理解我的问题是 协变与逆变 的问题 但是怎么具体到我的例子中 要怎么写 还没有看懂[/quote]
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
这是不行的。建议别人看以前最好自己先看看。[/quote] 谢谢指正,我本来是想说如果使用协变类型 AB要有关系,但不是说能转换。 List<A> 和 List<B> 是完全不相关的两个类型。
threenewbee 2013-08-09
  • 打赏
  • 举报
回复
引用 9 楼 whd0310 的回复:
[quote=引用 8 楼 caozhy 的回复:] [quote=引用 2 楼 lizhi3186575 的回复:] 这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
引用 4 楼 ayun00 的回复:
[quote=引用 2 楼 lizhi3186575 的回复:] 这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
理解我的问题是 协变与逆变 的问题 但是怎么具体到我的例子中 要怎么写 还没有看懂[/quote]
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
这是不行的。建议别人看以前最好自己先看看。[/quote] 谢谢指正,我本来是想说如果使用协变类型 AB要有关系,但不是说能转换。 List<A> 和 List<B> 是完全不相关的两个类型。[/quote] 不是,C#根本没有支持“协变类型”,只是换汤不换药地刷了小手段。
threenewbee 2013-08-08
  • 打赏
  • 举报
回复
引用 2 楼 lizhi3186575 的回复:
这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
引用 4 楼 ayun00 的回复:
[quote=引用 2 楼 lizhi3186575 的回复:] 这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
理解我的问题是 协变与逆变 的问题 但是怎么具体到我的例子中 要怎么写 还没有看懂[/quote]
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
引用 7 楼 whd0310 的回复:
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
这是不行的。建议别人看以前最好自己先看看。
裸奔的蜗牛 2013-08-08
  • 打赏
  • 举报
回复
List<A> 和 List<B> 是完全不相关的两个类型,A、B确定后该泛型就为封闭类型,为指定前是开放类型,除非你详细的知道A\B的内部结构。 也可以在泛型参数中指定参数是协变的,这就要求类型 A和B有一定的继承关系(类继承或接口继承)。
烈火蜓蜻 2013-08-08
  • 打赏
  • 举报
回复
baidu协变和逆变
ayun00 2013-08-08
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
List<B> list = base.getlist().Select(x => x as B).ToList(); 不过从A转换到B需要自己重载显式转换运算符,反之不需要。
这样效率高吗?
ayun00 2013-08-08
  • 打赏
  • 举报
回复
引用 2 楼 lizhi3186575 的回复:
这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
理解我的问题是 协变与逆变 的问题 但是怎么具体到我的例子中 要怎么写 还没有看懂
threenewbee 2013-08-07
  • 打赏
  • 举报
回复
List<B> list = base.getlist().Select(x => x as B).ToList(); 不过从A转换到B需要自己重载显式转换运算符,反之不需要。
人生导师 2013-08-07
  • 打赏
  • 举报
回复
这涉及到泛型的可变性,可以使用out参数或in参数来实现转换,具体参考文章:http://www.cnblogs.com/zhili/archive/2012/11/12/GenericVari.html
ayun00 2013-08-07
  • 打赏
  • 举报
回复
自己顶一下......
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的类,而那些类里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的类创建新类的过程,现有的类称作基类(或父类),创建的新类称作派生类(子类)。继承其实就是自动地共享基类成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型类型的限定 3.反射 代码概述: bean :Person.java 这个人员类我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx
一、泛型 为什么要有泛型集合(List,Dictionary,LinkedList)? 1.为了避免装箱拆箱; 2.复用集合类里的 代码(算法) List List 1.概念 1.1官方:是一种特殊的【算法重用】机制。允许程序员在代码将 变量或参数的类型 先用【类型占位符】来代替,等到运行的时候再根据传入的【类】来替换 通俗:类也可以带参数了!但是这个参数必须是 类型!用来在 类的代码 暂时代替 类的位置,然后会在运行时,被替换。 【例子】: public class MyList { T[] arr; public MyList(T[] arrp) { arr = arrp; } } 2.语法 2.1泛型的运行 当 运行的时候,JIT会帮我们生成泛型类的不同版本,通过如下代码可以验证: //aa是MyList一个int的静态变量 MyList.aa = 11; MyList.aa = 22; //照理说,同为MyList类的静态变量,应该保存最后一次赋值的 22 //但是输出的时候,确实生成了两个不同的版本 Console.WriteLine(MyList.aa.ToString());//11 Console.WriteLine(MyList.aa.ToString());//22 //由此看出,JIT在运行代码的时候,分别为带不同的 泛型参数 的MyList类生成了不同的版本。 MyList.dd = new Dog(); MyList.dd.age = 11; MyList.dd = new Dog(); MyList.dd.age = 22; Console.WriteLine(MyList.dd.age.ToString());//11 Console.WriteLine(MyList.dd.age.ToString());//22 【问题】为什么JIT在执行的是有要根据泛型类 MyList里的T 来产生不同的 MyList类的版本? 因为 只有当T确定为某种类型的时候,JIT才有可能计算出 当前MyList类的对象在内存要分配多大的空间。 3.泛型约束 3.1基类约束 public class House where TPet:Dog //约束 TPet必须是 Dog或Dog的子类 where TPet2:Cat //约束 TPet必须是 Cat或Cat的子类 { TPet pet1; TPet2 pet2; }
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的类,而那些类里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的类创建新类的过程,现有的类称作基类(或父类),创建的新类称作派生类(子类)。继承其实就是自动地共享基类成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型类型的限定 3.反射 代码概述: bean :Person.java 这个人员类我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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