避免使用java(Generics)

时间:2013-11-05 08:19:32

标签: java generics

下面的演员阵容是否可以避免?

//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);
}

2 个答案:

答案 0 :(得分: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);
      }
    }
  }
}

答案 1 :(得分:0)

您可以使用:

type.cast(object);

避免警告。

请注意,这仍然可能抛出ClassCastException。

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

if (type.isInstance(object)){
    return type.cast(object);
} else {
   ... 
}