我目前正在开发一个使用Google Datastore存储数据的Android项目,可通过带有Objectify库的Cloud Endpoints访问。 objectify库在使用“@Subclass”注释解释多态性方面做得不错,但我遇到的问题是,当我生成用于Android代码的客户端库时,不包括子类。有没有办法强制编译器包含这些类?
这是我正在做的一个基本的例子。让我们从Objectify文档中获取多态性示例:
@Entity
public class Animal {
@Id Long id;
String name;
}
@Subclass(index=true)
public class Mammal extends Animal {
boolean longHair;
}
@Subclass(index=true)
public class Cat extends Mammal {
boolean hypoallergenic;
}
值得一提的是,所有这三个类都已在“ObjectifyService.factory()。register()”中注册。“使用上面的类我在我的api中有一个类似于这个的方法:
@ApiMethod(
name = "getAnimals", path = "zoo/getAnimals", httpMethod = ApiMethod.HttpMethod.GET
)
public Collection<Animal> getAnimals(final User user, @Named("IdList") Collection<Long> idList)
throws UnauthorizedException {
// If the user is not logged in, throw an UnauthorizedException
if (user == null) {
throw new UnauthorizedException("Authorization required");
}
Map<Long,Animal> animalMap = ofy().load().type(Animal.class).ids(idList);
ArrayList<Animal> animals= new ArrayList<>();
for (Long animalId:idList) {
animals.add(animalMap.get(animalId));
}
return animals;
}
正如您所看到的,最终的ArrayList“animals”可能包含Animals,Mammals或Cats,但生成的库只允许我访问Animal类。我需要确保子代码可用于Android代码。编译器如何知道要包含哪些类,是否有办法强制添加类?多态性是否会延续到客户端,还是只支持服务器端?
答案 0 :(得分:0)
这不是一个很好的答案,但你可以公开一个返回那些类型的无操作API(实际上只返回null;)。这应该迫使班级生成。如果有更正式的方法,请随时纠正我。