当前位置: 首页 > 面试题库 >

使用泛型克隆

颜修明
2023-03-14
问题内容

很久很久以前有一堂课:

public class Scope<C extends Cloneable & Comparable<C>> implements Comparable<Scope<C>>, Cloneable, Serializable {

   private C starts;
   private C ends;
   ...

   @SuppressWarnings("unchecked")
   @Override
   public Object clone() {
       Scope<C> scope;
       try {
           scope = (Scope<C>) super.clone();
           scope.setStarts((C) starts.clone()); // The method clone() from the type Object is not visible
           scope.setEnds((C) ends.clone()); // The method clone() from the type Object is not visible
       } catch (CloneNotSupportedException e) {
           throw new RuntimeException("Clone not supported");
       }
       return scope;
   }
}

在对象中,我们有:

protected native Object clone() throws CloneNotSupportedException;

而Cloneable接口是:

public interface Cloneable { 
}

我应该如何克隆呢?


问题答案:

我认为当前的绿色答案不好 ,为什么您会问?

  • 它添加了很多代码
  • 它要求您列出所有要复制的字段并执行此操作
  • 当使用clone()时,这对列表不起作用(这是HashMap的clone()所说的:返回此HashMap实例的浅表副本:键和值本身不会被克隆。)因此您最终需要手动进行操作(这使得我哭)

哦,顺便说一句,序列化也很糟糕,您可能必须在各处添加Serializable(这也让我哭了)。

那么解决方案是什么:

Java深度 克隆库克隆库
是一个小型的,开源的(Apache许可证)Java库,用于深度克隆对象。对象不必实现Cloneable接口。有效地,该库可以克隆任何java对象。如果您不希望修改缓存的对象,或者每当要创建对象的深层副本时,都可以在缓存实现中使用它。

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

在http://code.google.com/p/cloning/上进行检查



 类似资料:
  • 我们解决什么问题 我们知道,JDK中的Cloneable接口只是一个空接口,并没有定义成员,它存在的意义仅仅是指明一个类的实例化对象支持位复制(就是对象克隆),如果不实现这个类,调用对象的clone()方法就会抛出CloneNotSupportedException异常。而且,因为clone()方法在Object对象中,返回值也是Object对象,因此克隆后我们需要自己强转下类型。 泛型克隆接口

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 问题内容: 我正在使用GSON将JSON解码为T类型的对象,例如 但是,这将返回异常- java.lang.AssertionError:意外的类型。预期为以下之一:java.lang.reflect.ParameterizedType,java.lang.reflect.GenericArrayType,但得到:sun.reflect.generics.reflectiveObjects.Typ

  • 我正在尝试使用GSON库来正确处理一个名为fromJSON的方法 事实上,我有一些类的一个成员可以使用Java泛型来定义。例如,我可以创建一个等。所以我面临的问题是,我需要告诉GSON它应该使用哪一个T。这里是我在一个问题中运行的地方,因为我的当前代码正在将JSON对象转换为或,但是泛型对象不被视为、等,它只是被转换为。 我尝试了一些我在Stackoverflow中找到的答案,但我仍然无法得到正确

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据