我有两节课 一个是MyProduct,如下所示
@Entity
public class MyProduct extends ProductImpl implements Serializable{
.......
......
}
,第二个是ProductStore
@Component
public class ProductStore extends AbstractRowLevelSecurityProvider{
@Override
public Class<Serializable> getFetchRoot(AdminUser user,Class<Serializable> ser, List<FilterMapping> filter){
return MyProduct.class;//compile time error
}
但是我收到编译时错误
cannot cast from Class<MyProduct> to Class<Serializable>
我尝试了很多方法来解决这个问题,但仍然会出现错误,任何人都可以帮我解决此错误
答案 0 :(得分:1)
你这里有一个错字:
public class MyProduct extends ProductImpl implements Serialazable
您必须使用Serializable
代替Serialazable
。
答案 1 :(得分:1)
public class getFetchRoot(AdminUser user,Class ser,List filter){
返回MyProduct.class; //编译时错误
在上面的方法中,返回类型为Class<Serializable>
,但您将返回MyProduct.class;
。
这实际上相当于Class<Serializable> = MyProduct.class;
。
这不起作用。问题是 Generics不支持子类型。
从https://dzone.com/articles/5-things-you-should-know-about-java-generics
引用例如:我们不能拥有List<Number> list = new ArrayList<Integer>()
。
<强>原因:强>
上面显示的这段代码将无法编译,因为如果它编译比类型安全无法实现。为了使这更清楚,让我们采取下面显示的代码,在第4行,我们将一个long列表分配给一个数字列表。这段代码不能编译,因为如果它可以编译,我们可以在列表中添加一个double值。这可能导致
ClassCastException
在运行时无法实现类型安全。List<Long> list = new ArrayList<Long>(); list.add(Long.valueOf(1)); list.add(Long.valueOf(2)); List<Number> numbers = list; // this will not compile numbers.add(Double.valueOf(3.14));
要使其工作,您可以将方法返回类型设为Class<MyProduct>
或Class<? extends ProductImpl>
或Class<? extends Serializable>
。
有关更多信息和限制,请参阅上面的链接。
答案 2 :(得分:0)
如果您返回Class<Serializable>
,则应该返回该类类型。如果你想返回一个扩展Serializable
的类类型,你应该以这种方式声明方法。
使用Class<? extends Serializable>
代替Class<Serializable>
。
如果您无法更改超类中的方法签名。使用原始类型,如:
public class TestSer implements Serializable {
}
@SuppressWarnings("unchecked")
public Class<Serializable> getFetchRoot () {
Class testSerClass = TestSer.class;
return testSerClass;
}