- 浏览: 895983 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
1.协变式覆盖
在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。这样有什么好处呢?以Object类的clone方法为例:
class Object {
...
public Object clone() { ... }
}
在5.0以前,如果子类需要重载clone方法,必须像下面这样写代码:
class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Object clone() { return new Point(x,y); }
}
虽然在我们的Point类里,clone方法总是返回一个Point类型的对象,但却必须把返回类型写成Object,在外部使用clone方法时也必须使用恼人的强制类型转换。
在Java5.0以后,我们就可以利用新的覆盖规则,像下面这样编写代码:
class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Point clone() { return new Point(x,y); }
}
这样,我们就可以直接使用Point p2 = p1.clone(); 而不用强制类型转换了。
2.泛型重载
Java的方法重载一般指在同一个类中的两个同名方法,规则很简单:两个方法必须具有不同的方法签名。换句话说,就是这两个方法的参数必须不相同,使得编译器能够区分开这两个重载的方法。由于编译器不能仅仅通过方法的返回值类型来区分重载方法,所以如果两个方法只有返回类型不同,其它完全一样,编译是不能通过的。
在泛型方法的重载时,这个规则稍微有一点变化。先看下面代码:
class Overloaded {
public static int sum(List<Integer> ints) {
int sum = 0;
for (int i : ints) sum += i;
return sum;
}
public static String sum(List<String> strings) {
StringBuffer sum = new StringBuffer();
for (String s : strings) sum.append(s);
return sum.toString();
}
}
上面是两个泛型方法的重载例子,由于Java的泛型采用擦除法实现,List<Integer>和List<String>在运行时是完全一样的,都是List类型。也就是,擦除后的方法签名如下:
int sum(List)
String sum(List)
Java允许这两个方法进行重载,虽然它们的方法签名相同,只有返回值类型不同。这在两个普通方法的重载中是不允许的。当然了,如果两个泛型方法的参数在擦除后相同,而且返回值类型也完全一样,那编译肯定是不能通过的。
类似地,一个类不能同时继承两个具有相同擦除类型的父类,也不能同时实现两个具有相同擦除的接口。如Class A implements Comparable<Integer>, Comparable<Long>。
总结一下,两个泛型方法在擦除泛型信息后,如果具有相同的参数类型,而返回值不一样,是可以进行重载的。Java有足够的信息来区分这两个重载的方法。
文章出处:http://www.diybl.com/course/3_program/java/javaxl/20071220/92738.html
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dichyzhu/archive/2009/04/07/4052031.aspx
发表评论
-
操作系统的目标和作用
2012-07-05 23:46 1343操作系统的目标 目前存在着多种类型的OS,不同类型的OS ... -
利用(ffmpeg)生成视频缩略图(java)
2012-07-01 01:11 0对于上传视频生成缩略图使用的是ffmpeg进行生成的。 自己在 ... -
对Java多线程技术中所有方法的详细解析
2012-06-06 11:32 793一、run()和start() 这两个 ... -
java乱码
2012-06-06 11:33 975自从接触Java和JSP以来, ... -
学习apache commons-io类库中的文件清除器
2011-07-06 23:26 1456学习apache commons-io 1.4类库中的File ... -
java 正则表达式 过滤html标签
2011-05-24 15:10 5359前段时间开发的时候要读取一篇文章的简介内容(也就是前200个字 ... -
转---Eclipse中web-inf和meta-inf文件夹的信息
2011-05-24 13:08 1140Eclipse中web-inf和meta-inf ... -
logback与Log4J的区别
2011-05-17 23:34 1446Logback和log4j是非常相似 ... -
性能优化
2011-04-14 16:10 1194(1)jdbc性能优化 jdbc程序的性能主要由两个因素决定 ... -
JAVA的Random类(转)
2011-04-12 00:21 917Random类中实现的随机算法是伪随机,也就是有规则的随机。在 ... -
非阻塞的Socket链接
2011-04-10 21:59 898import java.io.IOException; ... -
创建临时文件
2011-04-10 21:55 1098package net.java2000.io; ... -
面向对象设计的基本原则
2011-04-07 10:28 1153摘自:http://soft6.com/tech/6/6501 ... -
proxool
2011-04-02 15:01 867属性列表说明: fatal-sql- ... -
当前Java软件开发中几种认识误区
2011-04-01 10:12 886越来越多人开始使用Java ... -
Java中查看一个方法被调用的层次(Reflection、StackTrace)
2011-04-01 00:53 2045package test; public class Mai ... -
反序列化时恢复transient字段
2011-03-30 13:20 1221我们知道将字段设置为transient,可以避免该自动被序列化 ... -
用socket连接服务器直接发送接收邮件
2011-03-22 17:22 1305首页 新闻 论坛 问答 博客 招聘 更多 ▼ 专栏 &l ... -
利用JavaMail收/发Gmail邮件(SSL)
2011-03-22 17:21 2392Gmail目前已经启用了POP3和SMTP服务,具体情况请看 ... -
Java 反射与内省
2011-03-14 22:08 1079一、java反射机制 JAVA反 ...
相关推荐
- **协变与逆变**: 是泛型类型参数的特性,允许子类型代替父类型。 ### 集合框架 - **集合设计方面**: 如何选择合适的集合类以及集合框架的结构。 - **集合基础**: 包括Set、List、Queue和Map这些核心集合接口。 - ...
- **协变**:在泛型委托中允许子类型替换基类型。 - **逆变**:在泛型委托中允许基类型替换子类型。 #### 六十六、如何:合并委托(多路广播委托) - **多路广播**:展示如何将多个委托合并为一个。 #### 六十七、...
6. **返回类型**:多态方法的返回类型必须相同,或者返回类型之间存在协变关系(例如,父类类型可以作为子类类型的返回类型)。 7. **访问控制**:派生类的方法访问修饰符不能比基类更严格,这意味着如果基类方法是...
包括实例方法、操作符重载、特殊方法如`noSuchMethod`和`==`,获取器和设置器,抽象实例成员,实例变量,构造函数(生成式构造器、工厂构造器和常量构造器),静态方法,超类和超接口,类成员冲突,以及类的继承和...
4. **改进的泛型**:C# 4.0引入了协变和逆变的概念,使泛型接口和类在特定情况下可以接受更广泛的类型参数,提高了代码的可重用性。 5. **互操作性增强**:通过改进的COM互操作,C# 4.0更好地支持与非托管代码的...
- **变体**:Kotlin 支持协变和逆变,用于控制泛型参数的替换规则。 - **示例**:使用泛型来创建可复用的数据结构或函数。 #### 六、进阶技巧 **6.1 可见性修饰符** - **private**:限定成员只能在其定义的类内部...
- **类型形参差异**:通过协变和逆变支持泛型类型之间的转换。 #### 五、特性 特性是Visual Basic中的一种元数据标记,用于向类型添加额外的信息。 ##### 5.1 特性类 定义了特性类的基本结构和使用方式。 #####...
- `Out`:在泛型中指定类型协变。 - `Overloads`:重载已有属性或方法。 - `Overridable`:允许子类覆盖属性或方法。 - `Overrides`:明确指定重写父类的属性或方法。 4. **其他概念**: - `S.N`:这可能是...
而`List<Integer>`不能赋值给`List<Number>`,因为泛型不支持协变。所以AD是正确答案。 5. 命名原则:好的命名应该具有表达力、具体、包含重要信息,但不应过长。所以ABC是正确答案。 **判断题解析:** 1. 接口中...
- **变体**:探讨协变和逆变的概念。 - **泛型例子**:通过具体实例展示泛型的实际应用。 #### 设置界面 - **创建一个设置activity**:设计和实现一个用于配置应用设置的界面。 - **访问SharedPreferences**:通过...
- **重载与重写**:区分两者之间的差异,避免因签名相同导致的重载错误。 - **默认方法**:Java 8引入的接口默认方法允许在不破坏已有实现的情况下扩展接口。 7. **异常处理** - **异常链**:使用`cause`属性...
- `List<String>` 不能转换为 `List<Object>`,因为类型参数是不可协变的。 33. **解析 XML 的几种方式**: - DOM:将整个文档加载到内存中。 - SAX:事件驱动模型,逐个解析文档。 - PULL:简化版的 SAX,便于...
在面向对象编程中,多态允许子类覆盖父类的方法,从而根据对象的实际类型执行不同的行为。 #### 共同的 (Collectively) **共同的**指的是一组元素共同具有的特征或属性。在编程中,这可能指一组类共享的行为或属性...