是';菱形运算符';Java中缺少变量定义?
我从几年前的C#回到Java,那时Java7已经发布了一年左右——Java通用在某些方面对我来说似乎很奇怪 有一个我一遍又一遍地回来,看到这两个答案的流行 。。。似乎很多人(包括我在内)“自然”会期望“泛型集合”声明中的语法有不同的行为。考虑下面的代码示例 注意:架构正确性超出范围-假定是';菱形运算符';Java中缺少变量定义?,java,generics,Java,Generics,我从几年前的C#回到Java,那时Java7已经发布了一年左右——Java通用在某些方面对我来说似乎很奇怪 有一个我一遍又一遍地回来,看到这两个答案的流行 。。。似乎很多人(包括我在内)“自然”会期望“泛型集合”声明中的语法有不同的行为。考虑下面的代码示例 注意:架构正确性超出范围-假定baseClassesStorage应可用于外部世界中的get/add 上述两个答案中描述了此类行为的原因 但是我应该怎么做才能以“正确”和“优雅”的方式实现我的用例呢? 我知道的选项有: 似乎“正确的Jav
baseClassesStorage
应可用于外部世界中的get/add
上述两个答案中描述了此类行为的原因
但是我应该怎么做才能以“正确”和“优雅”的方式实现我的用例呢?
我知道的选项有:
最新基本类基本类存储的公共列表;
但通过这种方式,我实际上对“列表”的下界有了冗余定义——它已经在ListoFatLastBaseClasses类的“contract”中定义了。这里还有一个问题——如果在某个时候我想更改ListoFatLastBaseClasses类的下限,那么我需要遍历此类型的所有成员变量并更改它们的定义:(
最新基本类基本类存储的公共列表;
这将进行编译,但会在生成期间有效地删除类型检查并生成不需要的警告
-在Java中是另一回事ListoFatLastBaseClassesStorage;
-编译错误ListoFatLastBaseClassesStorage;
-编译错误ListoFatLastBaseClassesStorage;
public ListOfAtLeastBaseClasses<BaseClass> baseClassesStorage;
AtleastBaseClassesStorage的公共列表;
但这样的话,我实际上对“列表”的下界有了多余的定义
不完全是。当你定义泛型类型时,你是说这个类的用户可以声明变量,比如
ListOfAtLeastBaseClasses<Foo> listOfFoo;
ListOfAtLeastBaseClasses<Bar> listOfBar;
ListoFatLastBaseClasses ListoFoo;
ListofAtlastBaseClassesListofBar;
其中,Foo和Bar必须是基类的子类。基类是一个上限。但是泛型类型的用户可以选择限制性更强的列表,因此只接受Foo或Bar的实例
当您将您的列表声明为
ListOfAtLeastBaseClasses<BaseClass>
ListoFatLastBaseClasses
您选择创建一个可以接受任何类型基类实例的列表
我们可以想象一种特殊的语法来表示
listofataleasteclasses
,但这不是菱形运算符的作用,而且在我看来,这种特殊的语法会引入不必要的复杂性。你能更详细地说明你所说的“不必要的复杂性”是什么意思吗?我之所以这样问,是因为我将数百个变量声明为listofataleastebaseClasses
比类似于ListOfAtLeastBaseClasses
或ListOfAtLeastBaseClasses
的东西更复杂。很快,当前的菱形操作符在创建实例的过程中消除了类型定义冗余。我认为消除“变量定义”的冗余同样会降低代码的复杂性。泛型类型的大多数用法在于使用比上限更具体的类型(否则,首先将类型设置为泛型就没有什么意义了)。例如:我不记得上次使用列表是什么时候了。添加另一种语法会使泛型更加复杂,并且不会添加任何我们现在可以做的事情。菱形运算符不同,因为它解决了非常非常常见的冗长问题。但无论如何,您和我都无法更改语言,所以。。。更不用说你的建议会降低代码的可读性我必须查看Foo的类型定义才能知道上限是什么。我认为在定义基本列表类的同时,给它起的名字要比只定义Foo
更好,例如接口footems扩展了列表
ListOfAtLeastBaseClasses<Foo> listOfFoo;
ListOfAtLeastBaseClasses<Bar> listOfBar;
ListOfAtLeastBaseClasses<BaseClass>