0

可以避免下面的演员表吗?

//Is there a way this can be implemented so the cast is not necessary? 
FooService fooService = new FooService();
Foo f = (Foo)fooService.findById(id);

public class FooService extends DomainServiceImpl<Foo> {
}

public class DomainService<T extends Persistable>{

   private Class<T> type;

   public void findById(long id) {
      domainDao.findById(id, type);
   }
}

编辑:还是要投

public T findById(long id) {
    return (T) fooDao.findById(id, type);
}
4

2 回答 2

1

嗯,在获得评论树之前,我将发布一个可能适合您需求的解决方案。但是,您必须使其适应您的特定问题。

主要思想是,该方法findById返回泛型类型T,因此您不需要在代码中进行类型转换。

class Solution {
  static class Foo extends Persistable {
  }

  public static void main(String[] args) {
    FooService fooService = new FooService();
    Foo f = fooService.findById(0l);
  }

  static class FooService extends DomainService<Foo> {
    FooService() {
      type = Foo.class;
    }
  }

  static class Persistable {
  }

  static class DomainService<T extends Persistable> {

    Class<T> type;

    public T findById(long id) {
      try {
        return this.type.newInstance();
      }
      catch (InstantiationException e) {
        throw new RuntimeException(e);
      }
      catch (IllegalAccessException e) {
        throw new RuntimeException(e);
      }
    }
  }
}
于 2013-11-05T08:31:18.803 回答
0

您可以使用:

type.cast(object);

以避免警告。

请注意,这仍然可能引发 ClassCastException。

如果您不确定该对象是否可以投射,请检查:

if (type.isInstance(object)){
    return type.cast(object);
} else {
   ... 
}
于 2013-11-05T08:58:04.063 回答