使用<;有什么区别;?扩展一些抽象概念>;与java泛型中的SomeAbstract相比
我将从DotNet转向java,而extends的概念是新的使用<;有什么区别;?扩展一些抽象概念>;与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显然有
我已经看到一些帖子详细解释了如何使用
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
执行某些操作,您还会发现您无法调用realSomeAbstract
类中声明的任何方法。这是一个很好的例子,说明了为什么您应该始终遵循使用单字母类型参数的惯例。。。如果你不这样做,那真的很混乱
这真的很长了,但我还想指出,所有这些基本上都与你问题的前半部分无关。像这样的通配符?扩展了一些摘要
和?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;
在泛型类声明中使用扩展
:
要理解为什么需要几个不同的构造来指定泛型,您必须阅读泛型存在时静态类型安全规则的理论名称。“我猜没有区别”——这是什么意思?在第二个例子中,
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;