泛型返回子类

时间:2016-04-14 20:10:08

标签: java generics

以下是我的课程。在Test类中,我无法返回SubClass的对象我收到错误

GenericClass类型中的方法method2(SuperClass,Class)不适用于参数(SubClass,Class)

public class GenericClass<T> {

    public T method1(T obj, Class<T> clazz) {
        System.out.println(obj);
        return obj;
    }

    public T method2(T obj, Class<T> clazz) {
        System.out.println(obj);
        return obj;
    }
}

public class Test extends GenericClass<SuperClass> {

    public SuperClass printMethod1() {
        SuperClass sClass = new SuperClass();
        sClass.setName("name");
        sClass.setEmail("email");
        sClass.setAddress("Address");
        return this.method1(sClass, SuperClass.class);
    }

    public SubClass printMethod2() {
        SubClass subClass = new SubClass();
        subClass.setName("testName");
        subClass.setEmail("testEmail");
        subClass.setAddress("testAddress");
        subClass.setName2("name2");
        return this.method2(subClass, SubClass.class);
    }
}

public class SuperClass {

    private String name;
    private String email;
    private String address;

    public String getName() {
        return this.name;
    }
    public void setName(String name_p) {
        this.name = name_p;
    }
    public String getEmail() {
        return this.email;
    }
    public void setEmail(String email_p) {
        this.email = email_p;
    }
    public String getAddress() {
        return this.address;
    }
    public void setAddress(String address_p) {
        this.address = address_p;
    }
}

public class SubClass extends SuperClass {

    private String name2;

    public String getName2() {
        return this.name2;
    }

    public void setName2(String name2_p) {
        this.name2 = name2_p;
    }

}

我需要GenericClass中的参数Class类用于不同的目的(我没有把逻辑放在这里)

我尝试过铸造,但它不起作用。你能建议我如何在printMethod2中返回SubClass对象。

1 个答案:

答案 0 :(得分:0)

声明带有绑定的类型变量应该适合您:

public <U extends T> U method2(U obj, Class<U> clazz) {...}

这意味着返回类型与传递给方法的对象类型相同。

这是唯一的解决方案,因为行

return this.method2(subClass, SubClass.class);

表明您希望该方法也返回与传递它相同的类型。

编辑:

示例代码的完整类看起来像这样:

public class GenericClass<T> {

    public T method1(T obj, Class<T> clazz) {
        System.out.println(obj);
        return obj;
    }

    public <U extends T> U method2(U obj, Class<U> clazz) {
        System.out.println(obj);
        return obj;
    }
}

(这里是关于Ideone的示例:http://ideone.com/SRlIfo。)