首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带集合的泛型

不带集合的泛型
EN

Stack Overflow用户
提问于 2010-08-31 21:15:56
回答 4查看 886关注 0票数 4

我有一个方法,它通常从列表中获取一项,并具有以下签名:

代码语言:javascript
运行
复制
myMethod(T item)

我想使用这个方法,但我知道我发送的是什么方法。

代码语言:javascript
运行
复制
SpecificItem myItem = new SpecificItem();

myMethod((T) myItem);

我对此不太满意。这是错误代码的征兆吗?

EN

回答 4

Stack Overflow用户

发布于 2010-08-31 21:29:55

最好把代码写到界面上。例如:

在myMethod中:

代码语言:javascript
运行
复制
<T extends <? super Item>> void (T item);

这告诉编译器只接受泛型类型T,它是Item接口/类的实现/扩展。这将确保给定的输入类型正确。编译器保证了这一点。

在主类中:

代码语言:javascript
运行
复制
Item myItem = new SpecificItem();

上面给出的代码是最佳实践。习惯它吧。但是(我不鼓励这样做)你也可以这样写代码:

代码语言:javascript
运行
复制
SpecificItem myItem = new SpecificItem();

您可以阅读Java源代码。例如,在类java.util.Collections中。在sort(List)方法中,您可能会注意到Joshua Bloch确保给定的输入始终采用正确的格式。要尝试一下,请执行以下操作:

代码语言:javascript
运行
复制
public class Class1 {
    public static void main(String[] args) {
        List<Class1> list = new ArrayList<Class1>();

        Collections.sort(list);
    }
}

上面的代码会产生编译错误。要修复此编译错误,Class1必须实现接口Comparable。这保持了方法sort( List )的前提条件,即假设给定的输入是一个可比较的列表。

哦,我几乎忘了你的问题。实际上,这不是一个糟糕的代码,因为它可以工作。我只想告诉你,有一个更好的方法可以做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2010-08-31 21:25:57

你可能正在寻找类似这样的东西:

代码语言:javascript
运行
复制
class C<? extends T> {

   public void myMethod(T myItem) {
      ...
   }

}
票数 1
EN

Stack Overflow用户

发布于 2010-08-31 21:31:54

调用该方法的方式看起来很奇怪。如果您已将泛型方法声明为

代码语言:javascript
运行
复制
public <T> void myMethod(T item);

编译器知道,T是某种抽象类型,您不应该向它强制转换输入参数。只要确保T没有在代码中声明为某个特定类型即可。

更新:查看这里的示例:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3609374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档