0

采用通用对象并返回另一个通用对象的方法的签名应该是什么,该对象与原始类相同还是子类?也就是说,如果该方法采用一些泛型 class 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>{}
}

抛开例子不谈,实际上我正在编写一个用于Commands 在命令模式中的类的注册表。当我通过其类获取对象时,我想获取适当Command的对象并将对象传递给它。

4

2 回答 2

2

我想你正在寻找这个签名:

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像这样从 `StringMessage 创建一个:

List<String> stringList = new GenericMessageListCreator().getList(StringMessage.class);
于 2013-07-10T21:14:56.937 回答
0

我什至不确定您希望使用哪种方法,但我假设它是getList()

private class GenericMessageListCreator() {
    public <T extends GenericMessage<?>> List<T> getList(Class<T> clazz) {
        return new ArrayList<T>();
    }
}
于 2013-07-10T21:40:15.277 回答