【问题标题】:Generic method declaration with List for generic parameter泛型参数列表的泛型方法声明
【发布时间】:2016-07-04 09:37:24
【问题描述】:

我一直在尝试使用泛型参数获取泛型方法,但我似乎无法让它工作。这是声明:

/**
 * Set items as table rows content
 * 
 * @param rows - table row content
 */
public abstract void setItems(List<?> rows);

这是实现:

@Override
public void setItems(List<Dto> bonuses) {
     //code here
}

Dto 是一个实际的类,但编译器说它看不到它的父类。

Table 类型的方法 setItems(List) 必须覆盖或 实现一个超类型方法

如果我在泛型声明中将它定义为单独的参数,那么编译器会说我的新类型隐藏了一个已经定义的类

我无法对编译器说我想要这个实现中的具体参数。 我尝试将其更改为类型而不是通配符,但产生相同的结果。如何让它与具体实现一起工作 (Dto) ?

【问题讨论】:

  • 好吧,如果您的基类接口没有帮助……您是否有特定的原因不想更改它?你知道,就像在你的基类/接口上放一些类型参数“T”;然后说 T 是 Dto?
  • 如果Dto 是某个基类,也可以将方法更改为:public abstract void setItems(List&lt;? extends Dto&gt; rows); 并且被覆盖的方法看起来相同。
  • 我不知道什么类型的 List(即 List 或 List)会实现,并且那些没有相同的父类/基类
  • 他们不共享相似的 getter,如果可能的话,我想避免在将使用此方法的方法和实现中进行强制转换和类检查
  • 像@Jägermeister 所说的那样做:code public abstract class TestClass&lt;T&gt; { public abstract void setItems(List&lt;T&gt; rows); }

标签: java generics


【解决方案1】:

像 cmets 中的@Jägermeister 所说的那样做:

public abstract class TestClass<T> {
    public abstract void setItems(List<T> rows);
}

用途:

public class Test extends TestClass<Dto> {

    @Override
    public void setItems(List<Dto> rows) {
        //TODO
    }
}

或者你可以将你的方法定义为

public abstract void setItems(List rows);

并使用类似

public void setItems(List rows) {....

但这不是好办法!

【讨论】:

  • 第二种方式不行,因为我需要类型转换,检查并且谁知道还有什么。
  • 第一种方法是一种解决方法。 Sun 清楚地在文档中使用了类似的东西:docs.oracle.com/javase/tutorial/extra/generics/methods.html,但我无法弄清楚方法实现中缺少什么。
  • 在您的方法中,您使用 code&lt;?&gt; 这不是您的 codeDto 的父类,因此编译器会抛出错误。另一种选择是使用 code&lt;Object&gt; 这样每个类都可以使用。但是你不能把它限制在没有反射的codeDto
  • Sun/Oracle 为此使用反射。您可以在列表界面中查看:codepublic interface List&lt;E&gt; extends Collection&lt;E&gt;等。您的链接说您应该像第一种方式一样使用反射。
  • 啊,我想我明白你的意思了。他们没有使用 code&lt;?&gt;,他们正在演示它如何在该代码中不起作用!看第3行的注释:code c.add(o); // compile-time error
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多