加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java针对泛型创建对象的中存在擦除的弥补措施

发布时间:2021-12-17 12:59:33 所属栏目:PHP教程 来源:互联网
导读:在Java中不能像才c++那样,直接声明泛型对象即使 T t=new T(); 但是java中针对这种问题也有一些解决方案,在这里提供三种方案 /** * * although in c++ could use new T() to creating a instance of type, but java not support this approach, this class * p
 在Java中不能像才c++那样,直接声明泛型对象即使 T t=new T(); 但是java中针对这种问题也有一些解决方案,在这里提供三种方案
 
 
/**
 *  
 * although in c++ could use new T() to creating a instance of type, but java not support this approach, this class
 * provider 3 solutions for this situation
 * @version $Revision: $ $Name: $
 */  
public class CreatingTypesSolutions {  
    public static void main(String[] args) {  
        // solution 1: pass in a factory object, and use that to make the new instance   
        ClassAsFactory<Employ> caf1 = new ClassAsFactory<Employ>(Employ.class);  
        /*
         * This compiles, but fails with ClassAsFactory<Integer> because Integer has no default constructor. Because the
         * error is not caught at compile time, this approach is frowned upon by the Sun folks. They suggest instead
         * that you use solution2
         */  
        // ClassAsFactory<Integer> caf2 = new ClassAsFactory<Integer>(Integer.class);   
        // solution 2:   
        ClassAsFactory2<Employ> caf21 = new ClassAsFactory2<Employ>(new EmployFactory());  
        ClassAsFactory2<Integer> caf22 = new ClassAsFactory2<Integer>(new IntegerFactory());  
        // solution 3: Template Method design pattern   
        IntegerGeneric ig1=new IntegerGeneric();  
        System.out.println(ig1.create());  
    }  
  
}  
  
class Employ {  
}  
  
class ClassAsFactory<T> {  
    public ClassAsFactory(Class<T> t) {  
        try {  
            T tObj = t.newInstance();  
            System.out.println(tObj.getClass().getSimpleName() + " object!");  
        } catch (InstantiationException e) {  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        }  
    }  
  
}  
  
// solution 2 :intgerface   
interface FactoryI<T> {  
    T create();  
}  
  
class ClassAsFactory2<T> {  
    public <F extends FactoryI<T>> ClassAsFactory2(F factory) {  
        System.out.println(factory.create().getClass().getSimpleName() + " create successful");  
    }  
}  
  
class EmployFactory implements FactoryI<Employ> {  
  
    public Employ create() {  
        return new Employ();  
    }  
  
}  
  
class IntegerFactory implements FactoryI<Integer> {  
  
    public Integer create() {  
        return new Integer(0);  
    }  
  
}  
  
// solution 3: Template Method design pattern   
abstract class GenericWithCreate<T> {  
    final T element;  
  
    GenericWithCreate() {  
        element = create();  
    }  
  
    abstract T create();  
}  
  
class IntegerGeneric extends GenericWithCreate<Integer> {  
     
    @Override  
    Integer create() {  
        return new Integer("4");  
    }  
      
  
}  

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读