如何阅读:public <T> T [] toArray(T [] array);

Mar*_*ake 2 java arrays collections inheritance arraylist

我已阅读有关泛型类型的文档,我知道使用它但我有一个问题"阅读"两种方法.

我使用"toArray()"并使用"asList()"但我不明白如何编写方法解决类型.

例1

public Iterator<E> iterator();
public Iterator<String> iterator();
Run Code Online (Sandbox Code Playgroud)

例2

public E get(int location);
public String get(int location);
Run Code Online (Sandbox Code Playgroud)

例3(这是我不明白的)

public static <T> List<T> asList(T... array) {
    return new ArrayList<T>(array);
}
public static <String> List<String> asList(String... array) {
    return new ArrayList<String>(array);
}

[modifiers]    [return type]   [¿What is this?]        [type param]
public static    <String>       List<String>      asList(String... array) {

                         v[type param for returned ArrayList]
    return new ArrayList<String>(array);
}
Run Code Online (Sandbox Code Playgroud)

例4(与例3相同)

public <T> T[] toArray(T[] array);

[modifier]    [return type]  [what is this?]         [param type]
public       <String>        String[]        toArray(String[] array);
Run Code Online (Sandbox Code Playgroud)

¿这是一种返回类型吗?

 <String> List<String>
Run Code Online (Sandbox Code Playgroud)

我曾阅读过论坛,但我找不到一些可以解释这个问题.所有回复都是如何使用它的解释,但我知道如何使用它.

提前致谢!

=====================编辑1 =========================== ==

我有一个测试:

import java.util.List;

public class ClassTest {

    public static void main(String[] args) {
        ClassTest.testClass(new String[]{"1","2","3"});
    }

    public static <String> List<String> testClass(String[] array){
        System.out.println("** public static <String> List<String> testClass(String[] array){");
       return null;
   }

   public static          List<String> testClass(String[] array){
       System.out.println("** public static          List<String> testClass(String[] array){");
        return null;
   }

}
Run Code Online (Sandbox Code Playgroud)

如果我执行测试,我有这个痕迹:

** public static          List<String> testClass(String[] array){
Run Code Online (Sandbox Code Playgroud)

如果我删除第二种方法,我有这个跟踪:

** public static <String> List<String> testClass(String[] array){
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它都有效.

也许和我的第一个问题不一样,但我认为是这样.

编译器认为这些方法与另一方法不同,因为如果y删除

<String>
Run Code Online (Sandbox Code Playgroud)

在第一个方法编译器中说该方法是重复的.

我不能理解你的回应.

=====================编辑2 =========================== ==

我有一些新的信息......在Oracle doc中存在这样的:

https://docs.oracle.com/javase/tutorial/java/generics/methods.html

https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

确切地说,我要求的是:类型推断(我不知道,目前......)与"通用方法"相关.

目前,我正在阅读这份文件......

我读完后会回来的.

谢谢大家!

PD:我不会完全忘记这个帖子,因为我可能会回来问.

=====================编辑3 =========================== ==

我已经阅读了Oracle的文档,我想我更了解它.

我认为这是了解它的最佳方式......

在类中,您可以定义动态类型,

public class Box<T>
Run Code Online (Sandbox Code Playgroud)

在方法中执行此操作的方法相同,如下所示:

public <U> void test()
Run Code Online (Sandbox Code Playgroud)

它之间的差异是"类型参数"的位置,但一般来说是相同的.

如果我错了,请纠正我.

下一步......稍微复杂一点:

public class Box<T> {
    private T variable;
    ....

    public <U> void test(){
        U variable = null;
        ...
Run Code Online (Sandbox Code Playgroud)

让我困惑的一件事是,我从未使用过参数化方法,只有这样:

public class Box<T> {
    private T variable;

    public void test(T variable){
        ...
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我永远不需要在方法中使用.

现在更复杂一些.我不明白为什么以下代码有效.我知道,这是一个非常奇怪的例子,但是因为我看不到它.

public class TestBox<Mike> {

    public static void main(String[] args) {
        TestBox<Charles> xb = new TestBox();
    }

    public static <Peter> void get(TestBox u){
    }

}
Run Code Online (Sandbox Code Playgroud)

这句话,每次都是......¿¿建议?我没有任何课堂电话"Mike"或"Peter"
<Mike > <Peter>

如果我离开,前面的代码编译.我想这是因为如果我在<>之间放一些东西可能是一个真正的类型.

然后我需要确认,静态之后的单词(或者public不是静态方法)只是一个"建议".

谢谢!!

=====================编辑4 =========================== ==

新问题与previos怀疑有关.

public <String> void testClass(String[] array){
    System.out.println("** public <String> void testClass(String[] array){");
}

public           void testClass(String[] array){
    System.out.println("** public        void testClass(String[] array){");
}
Run Code Online (Sandbox Code Playgroud)

为什么如果我在第一个方法中更改字符串为整数,我有错误...?整数是"WhatEverIWant"

public <Integer> void testClass(String[] array){
    System.out.println("** public <Integer> void testClass(String[] array){");
}
Run Code Online (Sandbox Code Playgroud)

为什么如果我更改Integer []的参数String [],它会再次起作用?

public <Integer> void testClass(Integer[] array){
    System.out.println("** public <Integer> void testClass(String[] array){");
}
Run Code Online (Sandbox Code Playgroud)

我认为这是不合逻辑的,在评论之前尊重,Ufff ......

Era*_*ran 5

<T>它不是返回类型,它是泛型类型参数的声明T,它可能出现在返回类型之前.

public <T> T[] toArray(T[] array)

T[]是返回类型,它表示toArray接受通用数组并返回相同类型的通用数组.

<String> List<String> toArray(String[] array),<String>是一个泛型类型参数(List<String>是返回类型),这是令人困惑的,因为它隐藏了java.lang.String类.它完全等同于<T> List<T> toArray(T[] array).

编辑:

public static List<String> testClass(String[] array)
Run Code Online (Sandbox Code Playgroud)

是接受的方法String阵列(即一个数组,其元素类型是java.lang.String),并返回一个ListString

public static <String> List<String> testClass(String[] array)
Run Code Online (Sandbox Code Playgroud)

是一个接受某个引用类型的数组的方法(它有一个名为的泛型类型参数String,与之无关java.lang.String)并返回List相同类型的数组.

这两种方法有不同的论点,即使看起来不是这样.

当您testClass使用String[]参数调用时,String将调用接受数组的非泛型方法,因为它的参数比通用方法更适合您传递的数组.如果删除非泛型方法,则会调用泛型方法,因为泛型方法接受任何非基本数组.

如果您尝试使用不同类型的数组调用该方法,它可能会帮助您更好地理解:

String[] strarray = {"a","b"};
testClass(strarray); // calls the first (non generic) method
Integer[] intarray = {1,2,3,4};
testClass(intarray); // calls the second (generic) method
Run Code Online (Sandbox Code Playgroud)