Java appropiate返回泛型对象的方法签名是什么?

Java appropiate返回泛型对象的方法签名是什么?,java,generics,Java,Generics,接受泛型对象并返回另一个泛型对象的方法的签名应该是什么,该泛型对象要么是原始类的相同对象,要么是原始类的子类?也就是说,如果方法采用某个泛型类A,则返回的对象保证是A或B,从而B(直接或间接)扩展A 下面的代码举例说明了我在函数getList()中尝试执行的操作: package.com公司; 导入java.util.ArrayList; 公共班机{ 专用干管(){ List stringList=新建GenericMessageListCreator.getList(StringGeneric

接受泛型对象并返回另一个泛型对象的方法的签名应该是什么,该泛型对象要么是原始类的相同对象,要么是原始类的子类?也就是说,如果方法采用某个泛型类
A
,则返回的对象保证是
A
B
,从而
B(直接或间接)扩展A

下面的代码举例说明了我在函数
getList()
中尝试执行的操作:

package.com公司;
导入java.util.ArrayList;
公共班机{
专用干管(){
List stringList=新建GenericMessageListCreator.getList(StringGenericMessage.class);
}
私有类GenericMessageListCreator(){
公共列表getList(类clazz){
返回新的ArrayList();
}
}
私有类泛型消息{
公共GenericMessage(){};
私人价值;
公共无效设置值(T值){
这个值=值;
}
公共值(){
System.out.println(“我包含”+内部值);
}
}
私有类StringMessage扩展了GenericMessage{}
私有类IntegerMessage扩展了GenericMessage{}
}

撇开示例不谈,实际上我正在编写一个类注册表,这些类用于命令模式中的
Command
s。当我按对象的类获取对象时,我希望获取相应的
命令
,并将对象传递给它。

我想您正在寻找此签名:

public <T1 extends GenericMessage> List<GenericMessage<T1>> getList(Class<T1> clazz) {
    return new ArrayList<T1>();
}
公共列表getList(类clazz){
返回新的ArrayList();
}
您将找到有关泛型方法的更多信息

编辑

根据我从您的示例代码中了解到的情况,我会选择(我纠正了您代码中的一些语法错误):

私有类GenericMessageListCreator{
公共列表getList(类clazz){
返回新的ArrayList();
}
}
私有类泛型消息{
公共GenericMessage(){};
私人价值;
公共无效设置值(T值)
{
这个值=值;
}
公共值(){
System.out.println(“我包含”+内部值);
}
}
私有类StringMessage扩展了GenericMessage{}
私有类IntegerMessage扩展了GenericMessage{}

因此,您将能够创建一个
列表我甚至不确定您希望在哪个方法上执行此操作,但我假设它是
getList()

私有类GenericMessageListCreator(){

public返回
GenericMessage
而不仅仅是
T
有什么意义?在本例中,没有。我想使用它的真正原因在问题的结尾解释。a实际上想返回处理T对象的某个对象a命令。然后我想将原始区域对象传递到该命令中,并在结果是这样的。返回一个列表很好。而且我只是选择了一个方便的列表,它已经有了一个通用的签名。不需要
T1
的上限。我没有正确地理解它。我知道有两个错误。我的答案是基于你的代码的,但是为什么你要返回一个
新的ArrayList()
当您的返回类型为
List
时?您的代码中有一些语法错误(例如,
GenericMessageListCreator
后面的括号,如果删除它们,您将不会再获得“意外标记”)。如果不使用
clazz
,为什么要传入?
public <T1 extends GenericMessage> List<GenericMessage<T1>> getList(Class<T1> clazz) {
    return new ArrayList<T1>();
}
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>{}
List<String> stringList = new GenericMessageListCreator().getList(StringMessage.class);
private class GenericMessageListCreator() {
    public <T extends GenericMessage<?>> List<T> getList(Class<T> clazz) {
        return new ArrayList<T>();
    }
}