java – 创建一个复制不同对象的泛型函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 创建一个复制不同对象的泛型函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3139字,纯文字阅读大概需要5分钟。
内容图文
所以我有一个用例,我需要复制类的对象(类可能会有所不同,具体取决于工厂的输入类型.
这是我想要做的样本
public interface DataUtil {
// the main wrapper
static Object copyObject(Object payload){
if(payload instanceof Human))
return copyEntry((Human) payload);
if(payload instanceof Car))
return copyEntry((Car) payload);
if(payload instanceof Planet))
return copyEntry((Planet) payload);
return payload;
}
static Human copyEntry(Human human) {
return Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
static Car copyEntry(Car car) {
return Car.builder()
.model(car.getModel())
.brand(car.getBrand())
.build();
}
static Planet copyEntry(Planet planet) {
// return builder like previous
}
}
如果你看一下copyObject函数,它可以完成预期的工作,但是他的问题是返回类型.目前,为了使自己兼容,它返回一个Object,但我更愿意返回它特定的类Object(例如人类或汽车)
有没有办法用Generics完成这个(使用< T>)?或者这首先是一个糟糕的做法?
解决方法:
Is there a way to get this done with Generics (using )? or is this
a bad approach in the first place to do?
这是一种糟糕的方法,因为您将参数作为参数接收.
你不能从中推断具体类型:而你使用的实例.这不是一个好方法.
这里有两个想法(足够相关)
1)介绍可复制的界面
您可以引入一个接口,您要复制的对象的类实现:
public interface Copyable<T> {
T copy(T t);
}
可以实施,如:
public class Human implements Copyable<Human> {
@Override
public Human copy(Human t) {
return Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
}
所以一般的copy()方法可能如下所示:
// the main wrapper
static <T extends Copyable<T>> T copyObject(T payload) {
return payload.copy(payload);
}
你可以用这种方式使用它:
Human human = new Human();
// set some fields ...
Human copiedHuman = copyObject(human); // compile
Car copiedCar = copyObject(human); // doesn't compile
2)使用访客模式
作为替代方案,它也是访问者模式的一个好例子:您希望根据参数的具体类型应用处理.
它允许将复制操作组合在一起,就像在实际代码中一样.
一般的copyObject()方法可以依赖于CopyVisitor,它将根据参数的具体类型进行复制:
@SuppressWarnings("unchecked")
static <T extends Visited> T copyObject(T payload) {
CopyVisitor visitor = new CopyVisitor();
payload.accept(visitor);
return (T) visitor.getCopy();
}
CopyVisitor实现了一个经典的Visitor接口:
public interface Visitor {
void visitHuman(Human human);
void visitCar(Car car);
void visitPlanet(Planet planet);
}
通过这种方式 :
public class CopyVisitor implements Visitor {
private Visited copy;
@Override
public void visitHuman(Human human) {
copy = Human.builder()
.name(human.getName())
.age(human.getAge())
.build();
}
@Override
public void visitCar(Car car) {
copy = Car.builder()
.model(car.getModel())
.brand(car.getBrand())
.build();
}
@Override
public void visitPlanet(Planet planet) {
//...
}
public Visited getCopy() {
return copy;
}
}
被访问的类(Car,Human,Plan)将实现一个特定的接口来“接受”访问者:
public interface Visited {
void accept(Visitor visitor);
}
如 :
public class Human implements Visited {
@Override
public void accept(Visitor visitor) {
visitor.visitHuman(this);
}
}
所以你可以用这种方式使用copy()方法:
Human human = new Human();
// set some fields ...
Human copiedHuman = copyObject(human); // compile
Car copiedCar = copyObject(human); // doesn't compile
内容总结
以上是互联网集市为您收集整理的java – 创建一个复制不同对象的泛型函数全部内容,希望文章能够帮你解决java – 创建一个复制不同对象的泛型函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。