gpt4 book ai didi

java - 对象化,Key 可能吗?解决方法?

转载 作者:行者123 更新时间:2023-12-03 20:26:44 25 4
gpt4 key购买 nike

我所说的类型是指允许我执行以下操作的东西。

public class AnyObject{

List<this.type> list;

}

我知道以下行不通。

public class AnyObject{

List<this.getClass()> list;

}

那么,我将如何创建一个列表,例如,无论this 是什么类型?

----------------更新----------------

抱歉,我想我没说清楚。我似乎明白没有办法逃避类型删除,但如果还有办法解决我的问题,我会更好地解释它。 披露,这更像是一个 Objectify 问题。抱歉,我现在才看到。

我们开始吧,尽我所能......

对于我计划保留的每个实体,在使用 Objectiy 的 GAE 数据存储中,我希望有一个方法来生成 Objectify Key<?>使用 id 和 parent 字段。让我们调用此方法 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, cannot declare Key of type T.

然后我试了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 - 对象化,Key<T> 可能吗?解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19615626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com