从基类返回继承的类

时间:2014-06-05 01:03:00

标签: java generics

是否有可能从java中的基类返回继承的类?
我尝试过这样的事情但当然没有用:

public class Entity <E> {
    private Long id;

    public Long getId() {
         return id;
    }

    public <E extends Entity<E>> E setId(Long id) {
        this.id = id;
        return (E) this;
    }
}

public class Category extends Entity<Category> {
    private String name;
}

Category category = new Category();
category.setId(666); // this need to be type Category without casting.

2 个答案:

答案 0 :(得分:0)

我认为不可能使用泛型,因为所有类型信息都会在编译期间被删除,然后,在运行时,每个type信息都会被丢弃。就像说,在执行时,每个类型参数都被解释为类型Object,并且自动插入强制转换,因为不会抛出ClassCastException。如果编译器无法保证这一点,您可能会收到类似unchecked warning

的警告

但我有一个想法,我会复制代码并亲自看看,谢谢你,而不是感谢covariant return types:D

public class Main3
{
    public static void main (String args[]) {
        Category category = new Category();
        category.setId (666L).getName(); // this need to be type Category without casting.
    }
    public static class Entity<E>
    {

        private Long id;

        public Long getId()
        {
            return id;
        }

        public <E extends Entity<E>> E setId(Long id)
        {
            this.id = id;
            return (E)this;
        }
    }

    public static class Category extends Entity<Category>
    {

        private String name;

        public String getName() // don't forget the good rule to use accesors :D
        {
            return name;
        }

        @Override
        public Category setId(Long id)
        {
            super.setId(id);
            return this;
        }
    }

}

希望它有所帮助!

答案 1 :(得分:0)

我做过这样的事情:

public class Entity <E> {
    protected Long id;

    public Long getId() {
    return id;
    }

    public E setId(Long id) {
    this.id = id;
    return (E) this;
    }
}

但我的朋友告诉我这是糟糕的设计,更好的方法是在每个班级制作界面并实施它:

interface Identified<E> {
    Long getId();
    E setId(Long id);
}

为什么会更好?