0 0

clone方法的使用困境--java编程思想第4版(中文)第369页练习1710

问题是这样的:一个定义为  Set union(Set a, Set b) 方法, 它返回a和b的并集。 它返回的Set是通过new HashSet(a)来创建的。  练习17提出一个问题, 要求避免使用new HashSet(a)来创建, 需要使用a.clone()。 并且要求这个方法还能接受EnumSet类型的参数 (EnumSet 实现了Set接口, java 5中的新加的). (第一次提问题, 希望自己描述清楚了!)。 代码如下, 尝试了几种办法, 不能根本上解决问题。 

 

 

public class Tmp {
  

    public static <T> Set<T> union(Set<T> a, Set<T> b) throws Exception {
        // 直接新建一个HashSet当然没有问题
        Set<T> res = new HashSet<T>(a);
        
        // TODO. 
        // 怎么搞?? 避免直接新建一个HashSet
        // ...
        
        // !编译不通过. 因为 Set接口里面没有clone方法
        // res = a.clone();
        
        // !向上转型成Ojbect对象, 这种做法也行不通. 因为不能直接调用Object对象的clone方法
        // res = ((Object) a).clone();
        
        // 试试使用反射. 貌似可以
        // 但遇到EnumSet.of(Color.RED)作为参数a时, 
        // 会报错. 
        // java.lang.NoSuchMethodException: java.util.RegularEnumSet.clone()
        // System.out.println("a的类型 " + a.getClass());
        // Method m = a.getClass().getDeclaredMethod("clone");
        // res = (Set<T>)m.invoke(a);
        
        // !向上转型成一个Clonable接口??
        // 这个是标记接口. 根本就没有clone方法
        // res = ((Clonable) a).clone();
                
        res.addAll(b);
        return res;
    }
  
    public static void main(String[] args) throws Exception {
        // 使用HashSet, ok
        Set<Integer> a = new HashSet<Integer>();
        Set<Integer> b = new HashSet<Integer>();
        a.add(1);              
        b.add(2);
        System.out.println(a);
        System.out.println(b);        
        System.out.println(union(a, b));
        
        // 使用EnumSet, 在union方法中直接新建一个HashSet没问题, 
        // 但使用clone就有问题了
        System.out.println(union((Set<Color>) (EnumSet.of(Color.RED)), 
            (Set<Color>) (EnumSet.of(Color.BLACK))));
    }
}

enum Color {
    RED, WHITE, BLACK, 
}
 

 

 

 

2012年8月11日 12:06

1个答案 按时间排序 按投票排序

0 0

企图下载教材看看题目,但没能找到有那道题的教材。

看了遍那个章节的内容,我猜测无外乎以下三种的一种

- 如果题目说定就是HashSet的话,那么直接造型后clone好了。

		if (a instanceof HashSet) {
			res = (Set) ((HashSet) a).clone();
		}

类似这样。比较难看。

- 用反射。你也提到了。

		for (Method m : a.getClass().getMethods()) {
			if (m.getName().equals("clone")) {
				res = (Set) m.invoke(a);
				break;
			}
		}

类似这样。没发生你说的会报错。

- 如果题目中要求深层copy,用书中那个序列化后反序列化方法。长长的就不贴了。
我觉得这种没必要。

2012年8月11日 15:13

相关推荐

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    darts-clone-java:用Java编写的DARTS(Double-ARray Trie System)克隆

    darts-clone-java 用Java编写的Double-ARray Trie System克隆。 该库基于称为“快速高效”库的 。入门设置要使用Maven添加依赖项,请使用以下命令: &lt; dependency&gt; &lt; groupId&gt;...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    Thinking in Java 中文第四版+习题答案

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结...

    Java中的clone方法详解_动力节点Java学院

    Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校

    Java中clone方法共6页.pdf.zip

    本资料"Java中clone方法共6页.pdf.zip"可能包含了关于如何理解和使用`clone()`方法的详细解释,以及它在实际开发中的应用示例。 `clone()`方法的主要用途是创建一个现有对象的副本,这个副本与原始对象具有相同的...

    darts-clone-java-master.zip_DARTS代码_darts

    在本压缩包"Darts-Clone-Java-Master.zip"中,包含了Java实现的DARTS算法源代码,非常适合初学者深入理解和实践时间序列分析。 DARTS的核心思想是通过自回归模型(AR,AutoRegressive)来预测未来的值,其中每个...

    tij4-code:java编程思想第四版-GIT

    《Java编程思想》第四版是 Bruce Eckel 的经典著作,这本书深入浅出地介绍了Java语言,深受广大开发者喜爱。"tij4-code:java编程思想第四版-GIT" 指的是该书的源代码已经托管在了Git版本控制系统中,方便读者查阅和...

    java-数组与方法及面向对象基础

    Java是一种广泛使用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。本教程将深入探讨Java中的数组、方法以及面向对象编程的基础概念,为初学者提供一个全面的学习指南。 一、数组 数组在Java中是存储同一...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    java_clone用法

    ### Java中的`clone`方法详解:浅拷贝与深拷贝 #### 一、引言 在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    grpc-java源码环境构建.doc

    GRPC-Java 源码环境构建 GRPC-Java 源码环境构建是一个相对复杂的过程,需要具备一定的技术基础和经验。本文将详细介绍 GRPC-Java 源码环境构建的步骤和过程,旨在帮助读者快速搭建 GRPC-Java 源码环境。 一、...

    Java深浅clone

    在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    NX二次开发UF-CLONE-ask-clone-related-dwgs 函数介绍

    NX二次开发UF_CLONE_ask_clone_related_dwgs 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-CLONE-ask-clone-related-cae 函数介绍

    NX二次开发UF_CLONE_ask_clone_related_cae 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-CLONE-set-clone-related-cae 函数介绍

    NX二次开发UF_CLONE_set_clone_related_cae 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-CLONE-set-clone-related-dwgs 函数介绍

    NX二次开发UF_CLONE_set_clone_related_dwgs 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    Clone Detection in Secure Messaging- Improving Post-Compromise

    Clone Detection in Secure Messaging- Improving Post-Compromise Security in Practice

Global site tag (gtag.js) - Google Analytics