如何返回一个通用类型的通用对象?

时间:2012-08-24 14:05:26

标签: java generics

说我有一个集合(不专注集合接口请)任何泛型类型的对象。 Set,TreeSet,ArrayList,SortedSet等......

然后我想要一个类似于这个伪方法的方法(有缺陷):

private static <T,V> T<V> returnPlease(T<V> obj) {
    return obj;
}

但现在我得到“Type T没有Type参数”

也就是说,我也想访问子通用类型。

我知道更常见的方式:

private static <T> T returnPlease(T obj) {
    return obj;
}

我只希望该方法能够访问它的TreeSet类型。 不仅是TreeSet,还有它使用的泛型版本,在本例中为String。

我的语法错误怎么办?这不可能吗?

==================编辑更加清晰==================

static interface AnInterface<Return, Param1> {
    public Return method(Param1 obj1);
}

private static <T,V> AnInterface<V, V> returnPlease(T<V> obj) {
    return new AnInterface<V, V>() {
        public V method(V v) {
            // Do something
            return null;
        }
    };
}

我希望这有助于理解更多...

1 个答案:

答案 0 :(得分:4)

这没有意义。所以你会成为O.K.使用Comparable<V> Set<V> a ThreadLocal<V>,即使他们唯一的共同点是他们每个人都有某些类型参数?

您写道“请不要专注于收藏界面”,但我认为这是唯一的选择;你需要有某种特定的有意义的要求,例如: “implements Collection<V>”,以使type参数有意义。例如,您可以写:

static interface AnInterface<Return, Param1> {
    public Return method(Param1 obj1);
}

private static <V, T extends Collection<? extends V>> AnInterface<V, V> returnPlease(T obj) {
    return new AnInterface<V, V>() {
        public V method(V v) {
            // Do something
            return null;
        }
    };
}

并且Java实际上足够聪明,可以根据您传递的参数类型推断TV,因此您可以编写例如:

AnInterface<String, String> x = returnPlease(new TreeSet<String>());