gpt4 book ai didi

Java Generic和Generic Class的继承

转载 作者:行者123 更新时间:2023-11-30 11:09:19 25 4
gpt4 key购买 nike

似乎通用容器不能使用比通用容器的函数签名更具体的类。

我怎样才能拥有一个容器,该容器使用比传递给它的函数之一更具体的类?这可能吗?我是否误解了 Java 中的泛型?

请看代码,因为它可能更容易理解这个问题。

    package com.demo;

public class Entity {
public String baseField;
}

public class ChildEntity extends Entity {
public String extraField;
}

public class EntityContainer<T extends Entity> {
public T instance;
}

public class EntityContainerWithMeta<T extends Entity> extends EntityContainer<T> {
public String childContainerMetaData;
}

public class EntityConsumer<T extends Entity> {
public void consum(EntityContainer<T> container){

}
}

public class DemoGeneric {

private class ChildChildEntity extends ChildEntity{
public String extraExtraField;
}

// Objective :
// - using generic
// - with a data container that hold a more specific Klass ( Klass extends Entity)
// - pass it to a less specific consumer ( that consum Entity not Klass)

// real word use case:
// Entity is the base class for all my Business Specific Object
// Container are List<T extends Entity>
// Consumer are ListAdapter for ListView (extends BaseAdapter) (from Android framework)

public void demo() {

// compile: (but then container cannot return ChildEntity with its getter)
//EntityContainerWithMeta<Entity> demoContainer =
//new EntityContainerWithMeta<Entity>();

// don't compile:
EntityContainerWithMeta<ChildEntity> demoContainer = new EntityContainerWithMeta<ChildEntity>();

demoContainer.instance = new DemoGeneric.ChildChildEntity();

EntityConsumer<Entity> consumer = new EntityConsumer<Entity>();

// here is the problem:
// required: EntityContainer<Entity>
// found: EntityContainerWithMeta<ChildEntity>
consumer.consum(demoContainer);

// if
// ChildEntity extends Entity
// and
// EntityContainerWithMeta extends EntityContainer
// why is this not compiling ?
}
}

编辑:

感谢大家的回答,我找到了这篇文章: http://blog.informatech.cr/2013/03/15/covariance-and-contravariance-in-java/

很好的解释了@kocko和@MarkoTopolnik提到的问题

最佳答案

将您的 consumer 声明更改为:

EntityConsumer<? extends Entity> consumer = new EntityConsumer<ChildEntity>();

If ChildEntity extends Entity and EntityContainerWithMeta extends EntityContainer why is this not compiling ?

因为 generics are not implicitly polimorphic .

关于Java Generic和Generic Class的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28192038/

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