2016-05-30 101 views
3

我有功能返回类的类型,并有一流的类型作为参数

private Class readObject (ObjectInput in, Class objectclass){ 
    try { 
     Object o = in.readObject(); 

     if (o instanceof objectclass) { 
      return (objectclass)o; 
     } 

    } catch (Exception e) { 

} 

在我的课堂我打电话这个功能:

ObjectInput in = (..) 
Type1 type = readObject (in, Type1.class); 
(do something with type) 
while(true){ 
    Type2 type2 = readObject (in, Type2.class); 
    (do something with type2) 

基本上的readObject应该返回的类,我作为参数,如果这是Object o的正确类型。你可以这样想,我有我正在阅读的Type1,Type2和Type3对象,但是如果我遇到Type3,我什么都不做。

我写的这段代码无法正常工作。例如,

Type1 type = readObject (in, Type1.class); 

给我警告“无法从Class转换为Type1”。

+0

你有三个不同的等级叫' Class','Type1'和'Type2'? – Gendarme

+0

Type1和Type2是类别yes。 “班级”是我尝试返回班级的方式。我也试过类和类,似乎没有帮助 – hokosha

+0

由于返回类型必须是'Type1'或'Type2'的实例,但您返回'Class'的实例 – Clayn

回答

8

你应该让你的方法仿制并返回一个实例的T(而不是Class<T>一个实例):

private <T> T readObject (ObjectInput in, Class<T> objectclass) 

编辑:你也应该改变你的if和你的施法,具体如下:

if (objectclass.isInstance(o)) { 
    return (T) o; 
} 
+0

我试过了。 'return(objectclass)o;'不起作用 – hokosha

+0

@hokosha怎么样'返回(类)o;'? – StephaneM

+0

你应该像'T'一样投掷:'return(T)o;' –

3

你有两件事情要做:

  1. 改变你的方法的签名为未来:

    private <T> T readObject (ObjectInput in, Class<T> objectclass) {

  2. 投你的对象使用动态Class.cast作为未来:

    return objectclass.cast(o);

相关问题