`
iamlotus
  • 浏览: 107905 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

用范型限制传入两个相同类型的参数

 
阅读更多

项目中老代码用到了一个beanCopy

static void  beanCopy(Object source,Object target);




这个代码是自己实现的,对于所有的getter都只考虑了getXX的形式,像boolan isAlive()之类的就无能为力了。这次想改成用apach的beanUtils,结果出了bug。检查下来发现居然有人把这个方法用在了不同对象上

Man man=null; 
Woman woman=null; 
BeanHelper.beanCopy(man,woman); 



考虑到这么作是有问题的,就想找出项目中所有这样的用法。

最初的想法很简单,把方法签名改成范型,不同类型的对拷就会报编译错误,一个个改掉就行。

static <T>  void beanCopy (T source, T target); 
可是这么改了居然没用,细细一看,由于编译器会自动推导T的类型。所以beanCopy  ("a",1)

会被自动推导成

 extends <Object>; void GenericType.b(? extends Object a, ? extends Object b) 


 

那么怎么办呢?想了一下,解决办法是先把签名改成这样, 这样所有 target不是source子类的调用都会报错

static <S, T extends S>   void beanCopy(S  source,T target) 


然后再把S和T颠倒一下,让所有source不是target子类的调用报错   

static  <T, S extends T>  void beanCopy(S  source,T target)



两下综合一下,就得到最后结果了。


话说回来,其实我是很想这样定义的,可惜这被认为是"Illegal forward reference to type parameter T",不支持啊!

static  <S extends T,T extends S>  void beanCopy3(S  source,T target) 




 

分享到:
评论

相关推荐

    java 带两个类型参数的泛型

    例如,一个函数可能接受两个相同类型的参数并返回它们的和: ```java public &lt;T extends Number&gt; T sum(T num1, T num2) { return num1.add(num2); } ``` 这个函数使用了一个类型参数 `T`,它必须是 `Number` ...

    一个很好的范型立例题

    Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...

    C++多范型设计

    C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据不同的类型参数实例化。这使得程序员能够编写出不依赖具体数据类型的通用代码,提升了代码的灵活性和可维护性...

    Java 范型攻略篇

    Java范型的核心概念是参数化类型(Parameterized Types),即允许在类、接口或方法中声明类型参数,从而在使用这些结构时可以指定具体的类型。例如,`ArrayList`在Java 1.5中被重构为`ArrayList&lt;T&gt;`,这里的`T`就是...

    范型程序设计与 STL.pdf

    范型编程的核心思想是参数化类型,即在编写代码时并不绑定到特定的数据类型,而是使用类型参数。这使得代码能够处理多种数据类型,增强了代码的灵活性和通用性。例如,C++中的模板(templates)就是实现范型编程的...

    c++多范型设计

    编译器会根据传入参数的类型和数量自动选择合适的函数进行调用。这提供了在不改变函数名称的情况下实现不同功能的便利。 3. **运算符重载**:运算符重载使得我们可以为自定义类型赋予与内置类型相同的运算符行为。...

    C++多范型设计(pdg)

    1. 函数模板:函数模板是一种泛型编程工具,它定义了一个函数的通用实现,而具体的类型参数会在编译时根据实际传入的参数自动推断。例如,`template&lt;typename T&gt; T max(T a, T b)` 是一个简单的函数模板,可以用于...

    Java程序设计范型和枚举PPT教案学习.pptx

    本文将深入探讨这两个主题。 首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、接口和方法中使用类型参数,从而实现泛化的数据容器。在Java中,范型也被称为参数化类型。例如...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    C/S范型是一种常见的软件架构,它将计算任务分配给两个部分:客户端(Client)和服务器端(Server)。客户端负责用户界面和数据展示,而服务器端负责数据处理和存储。C/S架构的一个主要优势在于其高效的资源利用和...

    C++ 多范型设计.rar

    1. 函数模板:例如,`template &lt;typename T&gt; T max(T a, T b)` 是一个简单的函数模板,它可以返回两个T类型的值中的较大者。T被称为模板参数,它代表任意类型。在调用时,编译器会根据传入的实际类型对模板进行实例...

    C++ 多范型设计

    例如,`template&lt;typename T&gt; T max(T a, T b)` 是一个简单的函数模板,用于找出两个参数中较大的一个,无论它们是整数、浮点数还是自定义类型。函数模板的使用可以消除重复的代码,提高代码效率。 2. 类模板:类...

    范型编程与设计模式之应用

    4. **模板参数**:模板有类型参数和非类型参数。类型参数用于表示不同的数据类型,如`template&lt;typename T&gt;`;非类型参数是常量表达式,如`template&lt;int N&gt;`。 5. **模板特化**:为了对某些特定类型提供更高效的...

    jdk1.5中的范型

    - **一个泛型类被其所有调用共享**:泛型类的所有实例都具有相同的行为,只是它们操作的数据类型不同。 - **转型和 instanceof**:在使用泛型时,需要注意类型转型和 `instanceof` 的使用,因为泛型信息在运行时会被...

    Java 范型Java 范型.doc

    Java 范型Java 范型

    分布式系统原理与范型

    《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...

Global site tag (gtag.js) - Google Analytics