Java泛型-如何将非泛型添加到泛型列表

Java泛型-如何将非泛型添加到泛型列表,java,generics,Java,Generics,我试图创建一个方法,将定义列表中的元素添加到通用列表中 代码如下: private List<IEntity> entities = new ArrayList<IEntity>(); public <T extends IEntity> List<T> values(Class<T> type) { List<T> types = new ArrayList<T>(); for (IEnti

我试图创建一个方法,将定义列表中的元素添加到通用列表中

代码如下:

private List<IEntity> entities = new ArrayList<IEntity>();

public <T extends IEntity> List<T> values(Class<T> type) {
    List<T> types = new ArrayList<T>();

    for (IEntity v : entities) {
        types.add(v); //Error
    }

    return types;
}
private List entities=new ArrayList();
公共列表值(类类型){
列表类型=新的ArrayList();
对于(第五部分:实体){
type.add(v);//错误
}
返回类型;
}
sytax错误发生在
类型上。添加(v)(T)的代码>无法应用于(com.test.entities.ienty)


有没有什么方法可以有效地完成我想做的事情,而不必使用石膏

不能将
IEntity
插入到包含
IEntity
-
t扩展IEntity
子类的列表中。您需要一个包含
IEntity
超类的列表才能在其中放入
IEntity
T超IEntity
,您不能将
IEntity
插入包含
IEntity
子类的列表中。您需要一个包含
IEntity
的超类的列表,才能在其中放入
IEntity
-
T super-IEntity
,由于您的程序不安全,编译器会给您一个类型错误

您有一个
列表
。您不知道
t
是什么,只是它扩展了
entity
。(让我们用数字作为例子,而不是
IEntity
,让它更清楚。)所以你有一个某种数字的列表,可能是
列表
,也可能是
列表
,你不知道。你想给它加上一个数字。但你们并没有理由相信这个列表可以容纳这个数字!
列表
不能包含任意数字,因为不能将Long、Float或Short放入
列表
——Java泛型是不变的


因此,基本上你的程序是坏的,编译器告诉你是坏的。

编译器给你一个类型错误,因为你的程序不安全

您有一个
列表
。您不知道
t
是什么,只是它扩展了
entity
。(让我们用数字作为例子,而不是
IEntity
,让它更清楚。)所以你有一个某种数字的列表,可能是
列表
,也可能是
列表
,你不知道。你想给它加上一个数字。但你们并没有理由相信这个列表可以容纳这个数字!
列表
不能包含任意数字,因为不能将Long、Float或Short放入
列表
——Java泛型是不变的


因此,基本上你的程序是坏的,编译器告诉你是坏的。

因为你没有提供更多关于你要做什么的具体结构的信息,所以很难提供更好的解决方案

interface Entity {} // In Java, unlike in .NET environment, interface names do not begin with "I". You write Entity or EntityInterface, sometimes also EntityInt

class EntityImpl {
    private final List<Entity> entities = new ArrayList<>();

    // List of T is undefined
    public <T extends Entity> List<T> getValues(Class<T> type) { // in Java it's important to write "get" for a getter-method before the property-name, if it's not a boolean-getter.
        List<T> types = new ArrayList<>();
        types.addAll((Collection<? extends T>) entities);
        return types;
    }
}
接口实体{}//在Java中,与.NET环境不同,接口名称不以“I”开头。您可以编写Entity或EntityInterface,有时也可以编写EntityInt
类EntityImpl{
私有最终列表实体=新的ArrayList();
//T的列表未定义
public List getValues(Class type){//在Java中,如果getter方法不是布尔getter,那么在属性名之前为它写“get”是很重要的。
列表类型=新的ArrayList();

addAll((Collection因为您没有提供更多关于您将要执行的操作的具体结构的信息,所以很难提供更好的解决方案

interface Entity {} // In Java, unlike in .NET environment, interface names do not begin with "I". You write Entity or EntityInterface, sometimes also EntityInt

class EntityImpl {
    private final List<Entity> entities = new ArrayList<>();

    // List of T is undefined
    public <T extends Entity> List<T> getValues(Class<T> type) { // in Java it's important to write "get" for a getter-method before the property-name, if it's not a boolean-getter.
        List<T> types = new ArrayList<>();
        types.addAll((Collection<? extends T>) entities);
        return types;
    }
}
接口实体{}//在Java中,与.NET环境不同,接口名称不以“I”开头。您可以编写实体或EntityInterface,有时还可以编写EntityInt
类EntityImpl{
私有最终列表实体=新的ArrayList();
//T的列表未定义
public List getValues(Class type){//在Java中,如果getter方法不是布尔getter,那么在属性名之前为它写“get”是很重要的。
列表类型=新的ArrayList();

types.addAll((Collection如果你想创建一个泛型类,你可以这样做

private class MyClass<T extends IEntity> {
    private List<T> entities;

    ...

    public List<T> values() {
        List<T> types = new ArrayList<>();

        for (T v : entities) {
            types.add(v); // All Good
        }
        return types;
    }
} 

interface IEntity { ... }

interface ISubEntity extends {...}
私有类MyClass{
私人名单实体;
...
公共列表值(){
列表类型=新的ArrayList();
对于(电视:实体){
类型。添加(v);//都很好
}
返回类型;
}
} 
接口属性{…}
接口ISubEntity扩展{…}
然后,当您知道您正在使用ISubEntity时,您可以如下实例化

MyClass<ISubEntity> myClass = new MyClass<>(); 
MyClass MyClass=新的MyClass();
随后对值的调用将返回为您键入的列表


这是关于泛型的正式在线教程。

如果你想创建一个泛型类,你可以这样做

private class MyClass<T extends IEntity> {
    private List<T> entities;

    ...

    public List<T> values() {
        List<T> types = new ArrayList<>();

        for (T v : entities) {
            types.add(v); // All Good
        }
        return types;
    }
} 

interface IEntity { ... }

interface ISubEntity extends {...}
私有类MyClass{
私人名单实体;
...
公共列表值(){
列表类型=新的ArrayList();
对于(电视:实体){
类型。添加(v);//都很好
}
返回类型;
}
} 
接口属性{…}
接口ISubEntity扩展{…}
然后,当您知道您正在使用ISubEntity时,您可以如下实例化

MyClass<ISubEntity> myClass = new MyClass<>(); 
MyClass MyClass=新的MyClass();
随后对值的调用将返回为您键入的列表

这是关于泛型的正式在线报告