2010-03-28 45 views
1

如何创建可调用重载方法的泛型方法? 我试过了,但它给出了一个编译错误。调用通用方法的重载方法

Test.java:19:发现不兼容的类型 :java.lang.Object中 要求:T Ť螈= getCloneOf(T); ^

import java.util.*; 

public class Test { 


private Object getCloneOf(Object s) { 
    return new Object(); 
} 

private String getCloneOf(String s) { 
    return new String(s); 
} 

private <T> Set<T> getCloneOf(Set<T> set){ 
    Set<T> newSet = null; 
    if(null != set) { 
    newSet = new HashSet<T>(); 
    for (T t : set) { 
    T newt = getCloneOf(t); 
    newSet.add(newt); 
    } 
    } 
} 

}  
+0

呃,你是否希望每种可能的类型都有'getCloneOf'方法?我的意思是,如果'T'是'Integer',你期望发生什么? – 2010-03-28 04:49:25

+1

@ asela38我期待看看是否有克隆参数化类型的方法,但问题是Object.clone()被保护,除非类实现了ICloneable,并且new T()没有工作。 http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure嗯... – 2010-03-28 04:55:16

回答

3

T变量只能被设置为等于T类的对象,或者它的一个子类。在你的情况下,getCloneOf()返回Object,这不会是T的子类,或者甚至必然是T是。

例如:

class Parent { 
    public void doStuff(){ 
    } 
} 

class Child extends Parent { 
    public void doDifferentStuff(){ 
    } 
} 

这是正常的:

Parent p = new Child(); 

因为如果p是一个子类对象这甚至会工作,因为它继承了父该函数:

p.doStuff(); 

这是不好的:

Child c = new Parent(); 

因为这应该在理论上工作,因为变量是Child类型的,但是前面的行允许这样会爆炸,因为Parent对象没有具有该名称的函数。

c.doDifferentStuff();