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();
随后对值的调用将返回为您键入的列表
这是关于泛型的正式在线报告