什么方法签名适合返回通用对象?

时间:2013-07-10 21:06:45

标签: java generics

采用泛型对象并返回另一个泛型对象的方法的签名是什么,该对象是原始类的相同还是子类?也就是说,如果该方法采用一些泛型类A,则返回的对象保证为AB,使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并将对象传递给它。

2 个答案:

答案 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>();
    }
}