首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解Java泛型

理解Java泛型
EN

Stack Overflow用户
提问于 2018-08-07 00:55:08
回答 2查看 68关注 0票数 -3

我有类足球扩展运动,然后创建列表,其中保存上述类的对象.It是以下面的方式完成

代码语言:javascript
复制
Class structure : class Football <T extends Sports> {}

STATEMENT : Collection <Football<? extends Sport>> list = New ArrayList<>();

上面这行到底是什么意思。为什么是“?”在statement.Can中,请将上面的陈述拆分并解释清楚

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-07 05:50:45

你所做的并不是很有意义。你真的想要一个泛型的类Football吗?也就是说,你可以这样做:

代码语言:javascript
复制
class AmericanFootball extends Sports {
}

class Soccer extends Sports {
}

class Football<T extends Sports> {
}

Football<AmericanFootball> anAmericanFootball;
Football<Soccer> aSoccerBall;

是不是真的想要你的意思:

或者你应该拥有:

代码语言:javascript
复制
class Football extends Sports {
}

你可能指的是美式足球(如果你住在美国)或足球(如果你住在世界其他地方)。你的对象是不是真的在谈论一个圆球或者,嗯,形状像美式足球的球?或者你的班级应该代表足球运动?

假设你的意思是:

类Football扩展了运动{}

代码语言:javascript
复制
Collection<Football> myCollection = new ArrayList<Football>();
Football ballOne = new Football();
Football ballTwo = new Football();

myCollection.add(ballOne);
myCollection.add(ballTwo);

现在,试着回答你真正的问题:

代码语言:javascript
复制
Collection<? extends Sports>

让我们从更简单的开始。您可以这样定义:

代码语言:javascript
复制
Collection<?> foo;

这意味着foo包含未知类型的对象。如果你要接收一个不同对象的集合,这是你可以做的事情。在没有测试的情况下,我相信你实际上可以以这种方式接收任何集合,但如果你这样指定它:

代码语言:javascript
复制
Collection<Object> foo;

那么你只能从字面上把它赋值给一个对象集合,而不是任何集合。无论如何,当泛型第一次让你指定所包含的内容时,人们会做收集,他们的代码是草率的。这是一个坏习惯,但值得理解。

不管怎么说,我试着这样做只是为了确保我没有错:

代码语言:javascript
复制
import java.util.Collection;
import java.util.ArrayList;

class Foo {
    public void blah() {
        Collection<? extends Foo> array = new ArrayList<Foo>();
        Collection<? extends Foo> badArray = new ArrayList<Object>();
    }
};

java喜欢第一行ArrayList代码,不喜欢第二行代码。原因是Foo满足,而Object不满足。

所以..。为了回答真正的问题,意味着它可以接受定义为foo的集合或Foo的任何子类的集合的任何集合类。

这意味着它可以拿ArrayList、ArrayList或ArrayList,但不能拿ArrayList,因为唱歌可能不是体育的子类。

票数 1
EN

Stack Overflow用户

发布于 2018-08-07 01:17:11

第一行定义了Football类,该类可以接受来自扩展Sport类的任何类的参数,也可以接受Sports类本身的参数。

代码语言:javascript
复制
class Football <T extends Sports> {}

上面是泛型类型的声明,带有参数部分( <>)。

下一行是创建一个Football类的Collection,它可以包含任何Football类,每个类都有一个扩展Sport类或Sports类的任何类型的参数。

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

https://stackoverflow.com/questions/51712376

复制
相关文章

相似问题

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