【问题标题】:Setting return type of method to type of calling object将方法的返回类型设置为调用对象的类型
【发布时间】:2015-01-24 17:14:09
【问题描述】:

我有一个方法定义如下:

public TYPE getById(ObjectId id) {
    return datastore.get(this.getClass(), id);
}

datastore.get()的方法签名是:

<T, V> T get(Class<T> var1, V var2);

如何正确设置方法的返回类型?注意datastore.get()返回的对象和我的实现类不是同一个类型,可以是子类。因此,我希望返回类型特定于该类。

【问题讨论】:

  • 它将返回特定于您的班级类型。什么问题?
  • 我希望返回类型与调用它的对象的类型相同。这个对象不一定是实现这个方法的对象,它可能是一个子类。
  • 所以,返回子类类型。有什么问题?
  • Child1Child2 都扩展了Parent,实现了这个方法。我希望能够声明:Child1 c1 = new Child1().getById(123); 同样,我希望能够声明:Child2 c2 = new Child2.getById(123)

标签: java generics


【解决方案1】:

我的理解是你想要这样的东西:

public class Factory<T> {
  public T getById(ObjectId id) {
    return datastore.get(T, id);
  }
}

public class Class1Factory extends Factory<Class1> {
  public Class1 getById(ObjectId id) {
    return datastore.get(Class1.class, id);
  }
}

您必须使用单独的工厂类,因为您无法将类参数化为自身。你不能说:

public class Class1 extends Parent<Class1> {
  ...
}

【讨论】:

  • "你不能说:public class Class1 extends Parent" 当然可以。
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2012-05-04
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多