采用泛型对象并返回另一个泛型对象的方法的签名是什么,该对象是原始类的相同还是子类?也就是说,如果该方法采用一些泛型类A
,则返回的对象保证为A
或B
,使B extends A
(直接或间接)?
以下代码在函数getList()
中举例说明了我正在尝试做的事情:
package com.company;
import java.util.ArrayList;
public class Main {
private Main(){
List<String> stringList = new GenericMessageListCreator.getList(StringGenericMessage.class);
}
private class GenericMessageListCreator() {
public List<GenericMessage<T1>> getList(Class<T1 extends GenericMessage> clazz) {
return new ArrayList<T1>();
}
}
private class GenericMessage<T> {
public GenericMessage(){};
private T internalValue;
public void setValue(T value) {
this.internalValue = value;
}
public void echoValue() {
System.out.println("I contain " + internalValue);
}
}
private class StringMessage extends GenericMessage<String>{}
private class IntegerMessage extends GenericMessage<Integer>{}
}
除了示例之外,实际上我正在编写一个在命令模式中用于Command
的类的注册表。当我通过类获取一个对象时,我想获取适当的Command
并将对象传递给它。
答案 0 :(得分:2)
我认为你正在寻找这个签名:
public <T1 extends GenericMessage> List<GenericMessage<T1>> getList(Class<T1> clazz) {
return new ArrayList<T1>();
}
您可以找到有关通用方法here的更多信息。
修改强>
根据我从示例代码中理解的内容,我会选择类似的内容(我在代码中更正了一些语法错误):
private class GenericMessageListCreator {
public <U, V extends GenericMessage<U>> List<U> getList(Class<V> clazz){
return new ArrayList<U>();
}
}
private class GenericMessage<T> {
public GenericMessage(){};
private T internalValue;
public void setValue(T value)
{
this.internalValue = value;
}
public void echoValue() {
System.out.println("I contain " + internalValue);
}
}
private class StringMessage extends GenericMessage<String>{}
private class IntegerMessage extends GenericMessage<Integer>{}
因此,您将能够像这样从StringMessage创建List<String
:
List<String> stringList = new GenericMessageListCreator().getList(StringMessage.class);
答案 1 :(得分:0)
我甚至不确定您希望这种行为采用哪种方法,但我假设它是getList()
:
private class GenericMessageListCreator() {
public <T extends GenericMessage<?>> List<T> getList(Class<T> clazz) {
return new ArrayList<T>();
}
}