Objectify,Key <T>是否可能?工作环境? - java

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

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>

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

实例化类型<?>的泛型类 - java

我正在为SCJP / OCPJP学习,并且遇到了一个对我来说很奇怪的示例问题。该示例代码实例化了两个通用集合:List<?> list = new ArrayList<?>(); List<? extends Object> list2 = new ArrayList<? extends Object>(); …

List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的? - java

我对Java泛型如何处理继承/多态感到困惑。假设以下层次结构-动物(父母)狗-猫(儿童)因此,假设我有一个方法doSomething(List<Animal> animals)。根据继承和多态性的所有规则,我假设List<Dog>是List<Animal>,而List<Cat>是List<Animal&g…

在HashMap <String,String>上循环时出现问题 - java

我有一个基本的HashMap。我正在尝试遍历它,并从Map中获取键和值。这是我所拥有的:Map<String, String> myMap = versionExtractor.getVersionInfo(); for(String key : myMap.keySet()) System.out.println(key); System.ou…