我所说的类型是指可以执行以下操作的内容。

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/

10-10 23:50