我所说的类型是指可以让我执行以下操作的东西。
public class AnyObject{
List<this.type> list;
}
我知道以下内容不起作用。
public class AnyObject{
List<this.getClass()> list;
}
那么我将如何创建一个让我们说一个列表,例如清酒,不管这是什么类型的?
- - - - - - - - 更新 - - - - - - - -
我很抱歉,我认为我没有说清楚。我似乎明白没有办法逃避类型擦除,但如果还有办法解决我的问题,我会更好地解释它。披露,这更像是一个客观化的问题。对不起,我现在才来看。
我们走吧,我尽可能地清楚......
对于我计划保留的每个实体,在使用 Objectiy 的 GAE 数据存储中,我希望有一种方法可以Key<?>
使用 id 和 parent 字段生成 Objectify。让我们调用这个方法generateKey()
。这是它的外观。
public Key<MyEntity> generateKey() {
Key<MyEntity> key = Key.create(this.parent, MyEntity.class, this.id);
return key;
}
问题是我必须为我创建的每个实体或多或少地编写这个确切的代码。其实,还有其他的重码,但我的观点可以单用这段重码来说明。
所以我尝试了这个。我创建了一个名为 MyProjectEntity 的类,并让我的所有实体都扩展了它。然后generateKey()
使用泛型实现了一个方法。
public abstract class MyProjectEntity<T, Y> {
@Id Long id;
@Parent Key<T> parentKey;
public Key<Y> generateKey() {
Key<Y> key = Key.create(this.parentKey, this.getClass(), this.id);
return key;
}
}
然后我用我创建的这个名为 MyProjectEntity 的新类扩展了我的所有实体类。像这样...
@Entity
public class MyEntity extends MyProjectEntity<MyEntityParent> {...}
听起来不错,现在我所有的实体都将有一个generateKey()
方法,但这并不完全奏效。Objectify 对我大喊大叫,说 IllegalArgumentException,不能声明 T 类型的 Key。
然后我试了一下Key<Object>
,Objectify还是不爽,Objectify说Object不是注册实体。我应该注册对象吗!?!?这有点失去了 Objectify 提供的键入密钥的全部意义。
有没有好的解决办法。谢谢!
-- 更新 2 --
既然有人指出 Key.create(myEntity) 我应该指出我的全部用途......
/**********************************************************************************************************************
* Constructors END & Identification and Relationship Methods BEGIN
**********************************************************************************************************************/
@ApiSerializationProperty(name = "id")
public String getWebSafeKey() {
String webSafeKey = getKey().getString();
return webSafeKey;
}
public void setWebSafeKey(String webSafeKey) throws BadRequestException {
try {
Key<MyEntity> key = Key.create(webSafeKey);
setKey(key);
} catch (IllegalArgumentException illegalArgumentException) {
throw new BadRequestException(ErrorMessage.INVALID_ID);
}
}
@ApiSerializationProperty(name = "parentId")
public String getParentWebSafeKey() {
String webSafeKey = parent.getString();
return webSafeKey;
}
public void setParentWebSafeKey(String parentWebSafeKey) throws BadRequestException {
if (id == null) {
try {
parent = Key.create(parentWebSafeKey);
} catch (IllegalArgumentException illegalArgumentException) {
throw new BadRequestException(ErrorMessage.invalidParentId("Property"));
}
} else {
/* Do nothing. Only set parent here if setWebSafeKey is never called, such as during a create. */
}
}
@ApiSerializationProperty(ignored = AnnotationBoolean.TRUE)
public Key<MyEntity> getParentKey() {
return parent;
}
public void setParentKey(Key<MyEntity> parentKey) {
this.parent = parentKey;
}
@ApiSerializationProperty(ignored = AnnotationBoolean.TRUE)
public Key<MyEntity> getKey() {
Key<MyEntity> key = Key.create(parent, MyEntity.class, id);
return key;
}
public void setKey(Key<MyEntity> key) {
id = key.getId();
parent = key.getParent();
}
public boolean webSafeKeyEquals(String webSafeKey) {
boolean equals;
if (id !=null & parent !=null) {
equals = getWebSafeKey().equals(webSafeKey);
} else {
equals = false;
}
return equals;
}
/**********************************************************************************************************************
* Identification Methods END & Other Getters and Setters BEGIN
**********************************************************************************************************************/
必须为我创建的每个实体插入所有这些,并将 MyEntity 替换为实际实体名称。这不仅仅是打字。这段代码不属于实体类,而是属于某个抽象父类。如果我只能拥有类中特定实体的唯一代码,我的模型会更简洁,更容易扩展。再次感谢。