Java 在类型为T的泛型类上,如果T是List,如何找到E<;E>;

Java 在类型为T的泛型类上,如果T是List,如何找到E<;E>;,java,generics,Java,Generics,我有一个用T参数化的泛型类。它保存T类型的数据,并有一些使用T类型的方法。但是,如果T恰好是一个列表,我希望能够编写一个方法,在其中我可以使用这个E作为一个类型,但我不确定是否有办法做到这一点 作为一个例子,考虑如下: class Test<T> { private T data; public void setData(T t) {data = t;} public T getData() { return data; } } 在这方面,我能做到 Test<Li

我有一个用
T
参数化的泛型类。它保存
T
类型的数据,并有一些使用
T
类型的方法。但是,如果
T
恰好是一个
列表
,我希望能够编写一个方法,在其中我可以使用这个
E
作为一个类型,但我不确定是否有办法做到这一点

作为一个例子,考虑如下:

class Test<T> {
  private T data;
  public void setData(T t) {data = t;}
  public T getData() { return data; }
}
在这方面,我能做到

Test<List<String>> test = new Test<>();
test.setCallback(new Callback<String>() {
  public void onSomethingHappened(String e) {}
});
有更好的方法吗?为了重新定义cap,基本上我想声明一个泛型方法,它的泛型类型
E
与类的泛型类型
T
相关,这样
T
就相当于
List
;而且,在理想情况下,如果T根本不是一个列表,则无法调用该方法。因此,您可以说这与使用
E
类并使用
List
甚至
声明方法相反。
我想这可能是不可能的,因为在编译时无法判断
T
是否是一个列表,但也许有比我上面的建议更聪明的方法?

只需提供方法通用参数:

public <K extends List<T>> void setData(K t) {
  data = t;
}
public void setData(K t){
数据=t;
}
用法示例:

 objRef.setData(new ArrayList<Integer>());
objRef.setData(新的ArrayList());

此方法强制您将绑定到类的T类型的列表作为参数传递。

我不确定您是否希望强制T成为列表。如果这样做,则可以使用两个通用类型参数—一个用于元素,另一个用于
列表

class Test<E,T extends List<E>> {
  private T data;
  public void setData(T t) {data = t;}
  public T getData() { return data; }
}
或者您可以消除T,只使用E:

class Test<E> {
  private List<E> data;
  public void setData(List<E> t) {data = t;}
  public List<E> getData() { return data; }
}
类测试{
私人名单数据;
public void setData(List t){data=t;}
public List getData(){return data;}
}

您的问题有点不清楚。但也许这能帮你。。。您可以编写方法声明,例如
publicsomethingwith(CallBack)
。但是请注意,由于类型擦除,此方法不能与类型参数不是某个.Hmm的
列表的方法同名,但是这样,E或T与类的泛型类型(我也称为T)没有任何关系?(另外,我希望回调操作在E上,而不是在T上,这样,如果该类包含字符串列表,则该方法将执行回调)。然后,当泛型类型是集合时,为该事件创建一个单独的类。我不知道您的API的确切意图,但请注意,如果调用方方法不关心类型参数,您可以使用通配符。我列出了一个我并不喜欢的替代方法。此外,它还将强制调用方手动构造正确的子类,以便访问setCallback方法(new SubTest而不是new Test),或者将T的类对象传递给工厂方法,用于确定是否为T instanceof List,因为在调用setData之前,没有对象可从中推断类型信息。如果
T
不是列表,那么回调的类型是否为
callback
(而不是
callback
)?或者根本就不会有任何回调?两者都表明您可能需要两个处理集合或单值类型的类(可能有一些共享的超类)。。。但你似乎比我更了解OP的意图:)这是一种我没有想到的方法,但不,我不想强迫t成为一个列表,但如果它是一个列表,我希望能够在E上操作,其中E是列表中元素的类型。@JHH然后阅读我的评论;然而,这基本上需要两个独立的类,不是吗?好吧,理想情况下,我不想要一个独立的子类,参见上面的原理,我最肯定的是不想强迫T成为一个列表。我自己列出了一个满足这些要求的解决方案,但还有其他问题(API有点含糊不清)。我正在寻找的是我可能忽略的其他潜在解决方案,它们也不需要单独的类或强制T成为列表。:)@不,你不能那样做。Java的类型系统不允许您表达诸如“如果这是某个特定类型,那么就这样处理它”之类的约束。不,这与我试图做的相反。请阅读我的整篇文章。再想想,说这是相反的可能有点苛刻。事实上,我没有看到你改变的是setData方法。但我不想强迫T成为一个列表,所以setData根本不应该提到列表。setCallback方法应该接受类型为E的参数,其中E是T的“元素”(如果且仅当T实际上是一个列表),可以这么说。
class Test<E,T extends List<E>> {
  private T data;
  public void setData(T t) {data = t;}
  public T getData() { return data; }
}
public E getFirst ()
{
    if (data != null && data.size() > 0)
        return data.get(0);
     else
        return null;
}
class Test<E> {
  private List<E> data;
  public void setData(List<E> t) {data = t;}
  public List<E> getData() { return data; }
}