Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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泛型中的SomeAbstract相比_Java_Generics_Programming Languages_Abstract_Extends - Fatal编程技术网

使用<;有什么区别;?扩展一些抽象概念>;与java泛型中的SomeAbstract相比

使用<;有什么区别;?扩展一些抽象概念>;与java泛型中的SomeAbstract相比,java,generics,programming-languages,abstract,extends,Java,Generics,Programming Languages,Abstract,Extends,我将从DotNet转向java,而extends的概念是新的 我已经看到一些帖子详细解释了如何使用List,我猜你说的是在类型参数声明中使用扩展。在这种情况下: class My_Abstract<T extends SomeAbstract> 有一个名为SomeAbstract的无界类型参数,可以是任何类型。请注意,SomeAbstract不再引用第一个示例使用的实际类型SomeAbstract 对此进行扩展:想象一下,如果第二个声明是classmyu-Abstract。T显然有

我将从DotNet转向java,而extends的概念是新的


我已经看到一些帖子详细解释了如何使用
List,我猜你说的是在类型参数声明中使用扩展。在这种情况下:

class My_Abstract<T extends SomeAbstract>
有一个名为
SomeAbstract
的无界类型参数,可以是任何类型。请注意,
SomeAbstract
不再引用第一个示例使用的实际类型
SomeAbstract

对此进行扩展:想象一下,如果第二个声明是
classmyu-Abstract
T
显然有一个类型参数,而不是实际的类型。但它不必被称为
t
。。。它可以被称为
E
Bob
SomeAbstract
。在所有这些情况下,它仍然只是一个类型参数。。。一个实际的类型永远不能到达那里,它也没有任何意义(类型参数的全部要点是不引用特定的类型,而是允许在创建类实例时将其他类型放在它的位置)

在您在中编辑的代码中,将My_Child的声明更改为

class My_Child extends My_Abstract<Object>
类My_Child扩展My_抽象
你会看到区别。如果您在第二个版本中尝试使用类型参数
SomeAbstract
执行某些操作,您还会发现您无法调用real
SomeAbstract
类中声明的任何方法。这是一个很好的例子,说明了为什么您应该始终遵循使用单字母类型参数的惯例。。。如果你不这样做,那真的很混乱


这真的很长了,但我还想指出,所有这些基本上都与你问题的前半部分无关。像
这样的通配符?扩展了一些摘要
?super-SomeAbstract
不用于类型参数声明(例如定义泛型类时使用的声明),它们主要用于方法参数<代码>列表
是解释为什么需要通配符的典型示例,因为通配符作为对象容器的性质使其相对容易理解,但与通配符相关的规则适用于任何泛型类型。我试图在中用相对笼统的术语解释这一点。

它允许您在其他地方参考
T

public class A<T extends SomeClass>{
    public A(T x){this.x=x;}
    public T x;
}
公共A类{
公共A(tx){this.x=x;}
公共信托;
}
然后类的用户可以使用他们的原始类型,而不必使用SomeClass

MyObject x = new A<MyObject>(new MyObject()).x;
MyObject x=newa(new MyObject()).x;

在泛型类声明中使用
扩展

  • 将可用作参数的类型限制为从扩展类派生的类型
  • 允许泛型类调用扩展类中声明的方法
  • 当手头的代码不关心类型参数的特定类型,而只关心其上的下限(扩展)或上限(超级)时,在方法中使用“?”关键字

    Wikipedia以一种非常务实的方式分析了不同结构的净效应


    要理解为什么需要几个不同的构造来指定泛型,您必须阅读泛型存在时静态类型安全规则的理论名称。

    “我猜没有区别”——这是什么意思?在第二个例子中,
    SomeAbstract
    是一个正式的类型参数。它不引用同名的类。你确定这就是你的意思吗?@Michael Brewer Davis我读过的帖子都是关于列表的,其中一个extend/super/specific是只读/写只读/两者都是。如果类型不是list/coolection.Wowah,我看不出这有什么关系。我在那里迷路了。“不再引用第一个示例使用的实际类型SomeAbstract”?在类My_Abstract中,SomeAbstract不引用类SomeAbstract,而是类型参数的名称。我的_摘要和我的_摘要是等价的!嗯,很有趣。我认为如果我给类型名一个已经分配给另一个类的标识符,它会抛出一个错误。当我在类型中键入XXX时,行显示了一个错误,但这一定是无关的。谢谢。这不是编译错误,但如果您使用IDE,您会看到一条警告,上面写着“类型参数'SomeAbstract'隐藏同名的类”
    class My_Abstract<T extends SomeAbstract>
    
    class My_Abstract<SomeAbstract>
    
    class My_Child extends My_Abstract<Object>
    
    public class A<T extends SomeClass>{
        public A(T x){this.x=x;}
        public T x;
    }
    
    MyObject x = new A<MyObject>(new MyObject()).x;