如何解决“Type miss match error”

时间:2016-03-07 09:24:42

标签: java

我有两节课 一个是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> 

我尝试了很多方法来解决这个问题,但仍然会出现错误,任何人都可以帮我解决此错误

3 个答案:

答案 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;
}