“T扩展Junk”在Java中的generics类中意味着什么?

我正在试着理解这里有什么表示法, 例如下面的例子 。 我想看看是否有人可以提供额外的代码来帮助我理解这一点。 如何用T扩展垃圾? 这意味着什么?

public class Junk { public Junk() { } public T returnType() { return null; //? what would I even return } //what would I do to make sense of this class } 

T是generics类型参数。 你知道它是垃圾或它的子类。 要从方法中返回任何有用的内容,您需要使用相同类型的其他方法。 例如:

 public class Junk { T var; public void setT(T var) { this.var = var; } public T returnType(){ return var; } } 

可以通过创建指定type参数的实例来使用它:

 Junk junk = new Junk(); junk.setT(new Junk()); junk.returnType(); 

这比简单地使用“Junk”而不是“T”更有用,因为可以使用子类型而不会丢失类型安全性。 如果您有子SubclassJunk ,那么您可以这样做:

 Junk junk = new Junk(); junk.setT(new SubclassJunk()); SubclassJunk subclass = junk.returnType(); 

请原谅我做出有根据的猜测,但是,

看起来T是未定义的类型,

语句看起来像一个约束,以确保T派生自Junk

所以,如果你有类似的课程

 public class SmallJunk extends Junk { } 

然后T可以是SmallJunk ,但不是其他类型。

class Junk是Java中generics编程的语法。 这意味着无论在类中使用何种类型T ,它都必须代表Junk 某些 (尚未知)子类。

特定

 public class junk> { public T returnType() { return (T)this; } } 

你会把它扩展为

 public class Subclass extends junk { } 

然后inheritance的returnType方法将返回Subclass 。 标准Java库中这种模式最突出的例子是enum类型,其中枚举Foo成为扩展Enum

你应该阅读这篇文章来理解它: http : //docs.oracle.com/javase/tutorial/java/generics/bounded.html