是否可以投两个不同的类但具有相同的属性?

时间:2015-05-22 15:54:24

标签: java

我有两节课。 ClassA和CLassB,它们没有任何关系,但它们都具有相同的属性。是否可以投射它们,或者我必须逐个设置属性?

6 个答案:

答案 0 :(得分:2)

不,如果实例没有任何关系,则无法将实例从一个类转换为另一个类。请查看Java Language Specification以了解可能的演员表和转换。

然而,您可以手动或使用Dozer等框架复制属性。

答案 1 :(得分:2)

您可以创建由两个类实现的Interface来设置属性。

这种方式而不是通过界面引用它们

示例

public interface PersonalInfo {

    public void setName(String name);
    public void setAge(int age);

}

然后你的实现

public class ClassA implements PersonalInfo {


String name;
int age;

//other things and methods
@Override
public void setName(String name) {
    this.name = name;
}

@Override
public void setAge(int age) {
    this.age = age;
}

}

对于ClassB

public class ClassB implements PersonalInfo {

String name;
int age;

//other things and methods

@Override
public void setName(String name) {
    this.name = name;
}

@Override
public void setAge(int age) {
    this.age = age;
}

}

答案 2 :(得分:2)

"施放"的唯一方法他们普遍使用这样的反射:

public static void copyObject(Object src, Object dest)
        throws IllegalArgumentException, IllegalAccessException,
        NoSuchFieldException, SecurityException {
    for (Field field : src.getClass().getFields()) {
        dest.getClass().getField(field.getName()).set(dest, field.get(src));
    }
}

示例:

static class ClassA {
    public int a;
    public String b;
    public double c;
}

static class ClassB {
    public int a;
    public String b;
    public double c;
}

public static void main(String[] args) throws Exception {
    ClassA a = new ClassA();
    a.a = 1;
    a.b = "test";
    a.c = 3.14;

    ClassB b = new ClassB();
    copyObject(a, b);
    System.out.println(b.a+", "+b.b+", "+b.c); // prints "1, test, 3.14"
}

但是,正如您可能猜到的那样,用Java做事并不是很好的方式。

答案 3 :(得分:0)

如果该类没有“是一种”关系(继承),则无法强制转换该类。在这种情况下,必须逐个设置属性。可能是要向其中一个类添加一个方法来进行转换。

public class ClassB {
    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
    public ClassA transformToClassA(){
        ClassA obj= new ClassA();
        obj.setNum(this.num);
        return obj;
    }
}

答案 4 :(得分:0)

不,你不能施展它们。您可以手动设置属性(优选方式)或编写某种处理器来读取类定义并从具有相同名称的字段中设置字段 - 但这将非常脆弱,因为如果您决定使用更改某些属性的类型,类A中此属性的类型将与B类中的属性不兼容,您只能在运行时发现这一点。如果您稍后决定将属性添加到其中一个,而不是另一个,则会发生同样的情况。你可以明显地设计一些防御措施,但这意味着要创建一个复杂的逻辑,而你可以简单地手动设置属性而无需任何逻辑,并进行编译时检查。

答案 5 :(得分:0)

使用Json序列化/反序列化,例如与Gson,

import com.google.gson.Gson;

Class2 transform (final Class1 original) {
    return gson.fromJson(gson.toJson(requestOriginal), Class2.class);
}

这也可以递归进行。