Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是';菱形运算符';Java中缺少变量定义?_Java_Generics - Fatal编程技术网

是';菱形运算符';Java中缺少变量定义?

是';菱形运算符';Java中缺少变量定义?,java,generics,Java,Generics,我从几年前的C#回到Java,那时Java7已经发布了一年左右——Java通用在某些方面对我来说似乎很奇怪 有一个我一遍又一遍地回来,看到这两个答案的流行 。。。似乎很多人(包括我在内)“自然”会期望“泛型集合”声明中的语法有不同的行为。考虑下面的代码示例 注意:架构正确性超出范围-假定baseClassesStorage应可用于外部世界中的get/add 上述两个答案中描述了此类行为的原因 但是我应该怎么做才能以“正确”和“优雅”的方式实现我的用例呢? 我知道的选项有: 似乎“正确的Jav

我从几年前的C#回到Java,那时Java7已经发布了一年左右——Java通用在某些方面对我来说似乎很奇怪

有一个我一遍又一遍地回来,看到这两个答案的流行

  • 。。。似乎很多人(包括我在内)“自然”会期望“泛型集合”声明中的语法有不同的行为。考虑下面的代码示例

    注意:架构正确性超出范围-假定
    baseClassesStorage
    应可用于外部世界中的get/add

    上述两个答案中描述了此类行为的原因

    但是我应该怎么做才能以“正确”和“优雅”的方式实现我的用例呢?

    我知道的选项有:

  • 似乎“正确的Java方式”将变量声明为
    
    最新基本类基本类存储的公共列表;
    
    但通过这种方式,我实际上对“列表”的下界有了冗余定义——它已经在ListoFatLastBaseClasses类的“contract”中定义了。这里还有一个问题——如果在某个时候我想更改ListoFatLastBaseClasses类的下限,那么我需要遍历此类型的所有成员变量并更改它们的定义:(

  • 使用“原始”类型
    
    最新基本类基本类存储的公共列表;
    
    这将进行编译,但会在生成期间有效地删除类型检查并生成不需要的警告

  • …还有什么可能

    • ListoFatLastBaseClassesStorage;
      -在Java中是另一回事
    • ListoFatLastBaseClassesStorage;
      -编译错误
    • ListoFatLastBaseClassesStorage;
      -编译错误
  • 似乎“正确的Java方式”将变量声明为

    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>