4

假设我有一个任何泛型类型的集合(请不要关注Collection接口)对象。Set、TreeSet、ArrayList、SortedSet 等...

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

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

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

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

我知道更常见的方式:

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;
        }
    };
}

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

4

1 回答 1

5

这没有意义。所以你可以接受 aComparable<V> aSet<V> a ThreadLocal<V>,即使它们唯一的共同点是它们都有一些类型参数?

您写了“请不要专注于 Collection 界面”,但我认为这确实是唯一的选择;您需要有某种特定的有意义的要求,例如“实现Collection<V>”,才能使类型参数有意义。例如,您可以编写:

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>());
于 2012-08-24T15:09:37.303 回答