Java自定义范型的应用技巧
发布时间: 2012-2-21 09:41 作者: yue7603835 来源: 51Testing软件测试网采编
字体:
小
中
大
|
上一篇
下一篇
|
打印
|
我要投稿
|
推荐标签:
软件开发
java
我们在JAVA
中处处都用到了范型,JAVA中的范型是从C++模板继承来的,不过JAVA的范型的功能远远没有C++那么强大。
我们知道在C++中模板可以很方便的代替任意类型的数据如下;
template<class T>
void show(T x)
{
cout<<x<<endl ;
} |
上面的T可以代表任意类型的数据,这样不是大大减少了函数的重载次数,提高了效率呢。java是从C++过来的,理解了C++,jav也不在话下。
在java中自定义范型也可以用在方法上如下:
1、//这样声明的范型可以代替任意类型数据我们市场用到的键值对Map.Entry<K,V>不就是给予范型的吗
KV都可以代替任意类型的值,但是在java中范型的实际类型必须是引用类型
<K,V> void get(K k,V v)
{
}
|
2、Java中的范型不能像C++那么灵活
<T> T add(T a,T b)
{
//return a+b ;//很多人以为java也想C++一样可以这样 ,但是不可以 。
return null;
} |
这个返回的null也是有类型限制的,比如上面的ab分别是Integer和String那么就会取他们共同的基类Object做为返回值类型,其他的同理
3、实现任意类型的数组的成员值的交换,注意在自定义范型中范型的实际类型只能是引用数据类型不能是基本数据类型
public static <T> void swap(T[]a,int x,int y)
{
T tem =a[x] ;
a[x]=a[y] ;
a[y]=tem ;
} |
上面这个方法如果我 swap(new Integer[]{1,2,3,4,5},1,2); //这样就会自动交换下标12的值
但是这样调用就错了 swao(new int[]{1,2,3,5,6},2,3) ; //所以说Java的范型的实际类型 只能是引用数据类型
4、
<T extends String> 表示类型只能是String或者String的派生类
<T super String > 表示范型类型只能是String或者String的父类
用法同上
5、
下面这个函数利用范型来实现类型自动转换的功能
public static <T> T autoConvert(Object obj) //因为返回值是 T标识任意类型 所哟可以 将返回结果赋值给任意类型对象
{
return (T)obj;
}
Object obj=="";
String str=autoConvert(obj);
|
可以完成自动转换,因为范型T代表任意类型,因此他可以赋值给String类型的对象
6、将任意类型的对象填充到任意类型的数组中,与是fillArray(newInteger[]{2,3,4},"ddd");这样调用是正确的,这样做忽略类型限制
public static <T> void fillArray(T[] a,T b) //将任意一个对象填充到任意类型的数组
{
for(int i =0;i<a.length;i++)
{
a[i] =b ;
}
} |
7、以自定义范型的形式显示一个集合的数据,下面一个是利用自定义范型一个是利用通配符来实现,但是不同的是利用通配符操作的集合不能向集合中插入元素
但是自定义范型却可以。原因是通配符代表的集合我们不知道集合内部具体元素是什么类型所以不能对集合进行add操作。
public static <T> void showCollection(Collection<T> col,T obj) //利用范型来输出任意类型集合
{
col.add(obj) ;
for(T a:col)
{
System.out.println(a);
}
}
public static void showCollection(Collection<?> col) //利用范型来输出任意类型集合
{
for(Object obj:col)
{
System.out.println(obj);
}
}
|
8、如果一个类中多个方法都需要范型那么就是用类级别的范型。例如
class A<E>
{
public void add(E obj){}
public E get(){}
private E data;
} |
这样声明范型和在函数前面声明其实是一样的只不过是在类的级别上作用于整个类而已
9、要注意范型只是给编译器看的。
也就是说Vector<Integer>Vector<String>他们用到的都是同一份字节码,字节码只有class文件加载到内存中的时候才有
所以在一个类中下面2个方法不能同时存在
void show(Vector<Integer>) {}
void show(Vector<String>){} |
这两个方法都不是重载因为编译后要去掉类型信息。
分享到:
相关推荐
Java 范型Java 范型
### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...
- **容器类的使用**:Java集合框架中的类如`ArrayList`、`LinkedList`等都支持泛型,确保元素的类型安全。 总之,Java泛型通过引入类型参数和类型安全机制,极大地提高了代码的质量和可维护性,降低了类型转换的...
范型是Java SE 5.0引入的一个特性,它允许在类、接口和方法中使用类型参数,从而实现泛化的数据容器。在Java中,范型也被称为参数化类型。例如,`HashMap, Value>`就是一个范型类,其中`Key`和`Value`是类型参数,...
Java 实现泛型List的源码,基本实现了List接口的全部所有方法。欢迎大家发表自己的观点和建议。
Java自定义注解实现Redis自动缓存的方法是指在Java应用程序中使用自定义注解来实现Redis自动缓存的功能。该方法可以在实际开发中节省重复劳动,提高开发效率。 首先,需要创建一个自定义注解@RedisCache,该注解将...
参考:我眼中的Java-Type体系(1) 我眼中的Java-Type体系(2) 秒懂Java类型(Type)系统 Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现...
此外,Java泛型还有擦除的概念,即在编译后,泛型信息会被消除,转而使用原始类型。这是因为Java的泛型是类型安全的,但不是运行时类型检查的。尽管如此,泛型仍然在编译时提供了类型检查,使得我们能够在开发阶段就...
书中还特别强调了模板的编译期开销和潜在的代码膨胀问题,以及如何通过技巧和最佳实践来优化模板的使用,避免性能损失。 除了理论知识,本书还提供了丰富的实例和实战指导,帮助读者将学到的概念应用到实际项目中。...
Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和可读性。泛型允许我们在编写代码时指定容器(如List、Set、Map等集合类)能够存储的数据类型,从而避免了不必要的类型转换,并在编译时期就...
在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...
Java 泛型是一种强大的语言特性,它在...掌握Java泛型对于高效、安全地使用Java集合框架至关重要,它也广泛应用于自定义数据结构和算法实现中。通过深入理解并熟练应用泛型,开发者可以写出更加健壮、易维护的代码。
综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...
范型参考 (1).java
范型参考 (2).java
本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java的反射机制不能确定集合中的对象类型! 在实际应用中,如果能够灵活应用范型和反射...
范型编程是一种强大的软件开发方法,它允许程序员创建可重用的代码模板,这些模板可以应用于各种不同的数据类型。STL则是C++标准库的一部分,提供了容器、迭代器、算法和函数对象等高效工具,极大地提高了代码的效率...
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
锁机制的使用则保证了在进行数据更新时,多个分系统之间不会相互干扰,确保了数据的准确性和一致性。在实际应用中,消息队列和锁机制的结合为MDM提供了一个可靠且灵活的数据同步解决方案。 主数据管理机制的提出和...