是否有可能从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.
答案 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);
}
为什么会更好?