Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Declaration - Fatal编程技术网

Java 泛型定义

Java 泛型定义,java,generics,declaration,Java,Generics,Declaration,我无法理解整个泛型声明,即使在阅读了无数关于Java的文章和书籍中的条目之后,它们似乎都没有以简单明了的方式解释它。谁能给我解释一下吗 class Something<T> {...} class某物{…} 我知道T是什么,我知道当我们想要为传入的任何类型的类型对象编写通用定义/方法时,我们使用泛型,而不是为一种类型的对象扩展编写不同类型的方法,我们编写一个泛型方法,可以包含一种或多种类型(因此大写T)。但最让我烦恼的是下一个声明示例: public <T extends

我无法理解整个泛型声明,即使在阅读了无数关于Java的文章和书籍中的条目之后,它们似乎都没有以简单明了的方式解释它。谁能给我解释一下吗

class Something<T> {...}
class某物{…}
我知道T是什么,我知道当我们想要为传入的任何类型的类型对象编写通用定义/方法时,我们使用泛型,而不是为一种类型的对象扩展编写不同类型的方法,我们编写一个泛型方法,可以包含一种或多种类型(因此大写T)。但最让我烦恼的是下一个声明示例:

public <T extends Comparable<T>> void Something{...}
public void Something{…}
首先;Comparable是一个接口而不是一个类(如果我错了,请纠正我),那么为什么它是
扩展的
,而不是
实现的
。现在,为什么它必须在
void
和现在
compariable
之前声明(整个事情)??这是什么意思?进入的对象类型必须具有
实现可比较的
?因此,如果我想将class
classsomething{…}
作为类型参数传递,我会得到一个错误,但是传递
classsomething实现可比较的{…}
就可以了?请给我解开这个谜团:(我明天就要考试了,如果不掌握这个,我就不能做其他事情了……:(

顺序:

  • 泛型类型声明中的
    X扩展Y
    X超级Y
    分别表示“
    X
    is-a
    Y
    ”和“
    Y
    X
    ”。java开发人员不希望添加一个新的关键字,意思是“扩展或实现”
  • 声明在返回类型之前,可能是因为一旦声明了泛型类型变量,返回类型可能会使用其中的一些变量。顺便说一句,正如@Jack指出的,
    
    
  • extensed Comparable
    ”是一个约束。您只能用已知的自可比类型实例化类
    Something
    。因此
    Somethingsi=newsomething();
    是合法的,但
    SomethingSo=newsomething();不是,因为
    对象
    没有实现
    可比
    为了:

  • 泛型类型声明中的
    X扩展Y
    X超级Y
    分别表示“
    X
    is-a
    Y
    ”和“
    Y
    X
    ”。java开发人员不希望添加一个新的关键字,意思是“扩展或实现”
  • 声明在返回类型之前,可能是因为一旦声明了泛型类型变量,返回类型可能会使用其中的一些变量。顺便说一句,正如@Jack指出的,
    
    
  • extensed Comparable
    ”是一个约束。您只能用已知的自可比类型实例化类
    Something
    。因此
    Somethingsi=newsomething();
    是合法的,但
    SomethingSo=newsomething();不是,因为
    对象
    没有实现
    可比
    
    首先,在Java中,您有两件事:

    • 类GenericContainer之类的泛型类型
    • 通用方法,如示例
      public method()
    前者用于定义泛型类,后者用于定义泛型类型的方法。这是两件不同的事情,尽管两者使用相同的原则

    事实上,您必须明确声明方法是泛型的,如

    public <T extends Comparable<T>> void myGenericMethod(...)
    
    将工作,但您将无法在
    v1
    v2
    上调用任何内容,您将不被允许,因为
    t
    只是一个没有约束的泛型类型。
    v1.compareTo(v2)
    会导致编译错误。那么,如何解决此问题

    您可以对类型变量强制执行约束:

    public <T extends Comparable<T>> void method(T v1, T v2)
    
    公共作废方法(T v1,T v2)
    

    通过这种方式,您将被强制传递到
    method()
    同一类的实例,这些实例必须实现
    Comparable
    ,否则您将得到编译时错误。但是,您将被允许调用
    compareTo(…)
    因为可以保证传递给方法的对象能够响应它。

    在Java中,首先有两件事:

    • 类GenericContainer之类的泛型类型
    • 通用方法,如示例
      public method()
    前者用于定义泛型类,后者用于定义泛型类型的方法。这是两件不同的事情,尽管两者使用相同的原则

    事实上,您必须明确声明方法是泛型的,如

    public <T extends Comparable<T>> void myGenericMethod(...)
    
    将工作,但您将无法在
    v1
    v2
    上调用任何内容,您将不被允许,因为
    t
    只是一个没有约束的泛型类型。
    v1.compareTo(v2)
    会导致编译错误。那么,如何解决此问题

    您可以对类型变量强制执行约束:

    public <T extends Comparable<T>> void method(T v1, T v2)
    
    公共作废方法(T v1,T v2)
    
    这样,您将被迫传递到
    method()
    的实例