我所说的类型是指可以执行以下操作的内容。
public class AnyObject{
List<this.type> list;
}
我知道以下方法无效。
public class AnyObject{
List<this.getClass()> list;
}
那么,我将如何创建一个说这样的清单,例如清单?
---------------更新---------------
我很抱歉,我不清楚。我似乎越来越无法摆脱类型擦除,但是如果仍然有解决我的问题的方法,我会更好地解释。披露,这更多是一个Objectify问题。对不起,我现在来看。
我们走了,尽我所能...
对于我计划保留的每个实体,在使用Objectiy的GAE数据存储中,我希望有一种使用id和parent字段生成Objectify
Key<?>
的方法。让我们将此方法称为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不是注册实体。我应该注册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替换实际的实体名称。不只是打字。此代码不属于实体类,而是属于某些抽象父类。如果我只能拥有该类中特定实体所独有的代码,则我的模型将更简洁,并且更易于扩展。再次感谢。
最佳答案
这是没有道理的。考虑:您永远不会知道list
的类型。假设在某些类的某些方法中使用了list
,则this
可能始终是子类的实例。因此,在任何代码中都不能假定List
类型的list
参数。如果永远无法知道,那有什么意义呢?您只需使用List<?>
。
泛型是纯粹的编译时事物。因此,依赖某些东西的运行时类是没有意义的。
我建议你有
public class AnyObject<T> {
List<T> list;
}
例如,任何要使
Foo
成为list
的类List<Foo>
都应仅实现或继承AnyObject<Foo>
。关于java - Objectify,Key <T>是否可能?工作环境?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19615626/