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

时间:2016-03-29 09:18:47

标签: java arrays inheritance arraylist collections

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

我使用“toArray()”并使用“asList()”但我不明白如何编写解决类型的方法。

示例1

public Iterator<E> iterator();
public Iterator<String> iterator();

示例2

public E get(int location);
public String get(int location);

示例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);
}

实施例4(与实施例3相同)

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

[modifier]    [return type]  [what is this?]         [param type]
public       <String>        String[]        toArray(String[] array);

¿这是一种返回类型吗?

 <String> List<String>

我已经阅读了论坛,但我找不到一些可以解释这一点。所有回复都是如何使用它的解释,但我知道如何使用它。

先谢谢!

=====================编辑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;
   }

}

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

** public static          List<String> testClass(String[] array){

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

** public static <String> List<String> testClass(String[] array){

在这两种情况下都有效。

也许和我的第一个问题不一样,但我想是的。

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

<String>

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

我感谢您的回复。

=====================编辑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>

在方法中执行此操作的方法与此类似:

public <U> void test()

这是“类型参数”的不同之处,但总的来说是相同的。

如果我错了,请纠正我。

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

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

    public <U> void test(){
        U variable = null;
        ...

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

public class Box<T> {
    private T variable;

    public void test(T variable){
        ...

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

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

public class TestBox<Mike> {

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

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

}

这句话,每次都是......¿¿建议?我没有任何课堂电话“迈克”或“彼得”
     < {麦克{1}}      > {彼得{1}}

如果我离开,前面的代码会编译。我想那是因为如果我把东西放在&lt;&gt;之间可能是一个真实的类型。

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

谢谢!

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

与普遍存在疑问有关的新问题。

<

为什么我在第一个方法中更改单词String for Integer,我有错误...? 整数是“WhatEverIWant”

>

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

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){");
}

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

2 个答案:

答案 0 :(得分: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)

是一种接受String数组(即元素类型为java.lang.String的数组)并返回ListString的方法。

public static <String> List<String> testClass(String[] array)

是一个接受某个引用类型的数组的方法(它有一个名为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

答案 1 :(得分:1)

如果您在IDE中编辑测试代码(如'idea'或其他),您会看到'String'的颜色在第一种方法和第二种方法之间有所不同。这意味着编译器将第一个'String'视为'java.lang.String'。它只是一个单词,如T,E或任何其他单词。我认为Java应该让编译器检查通用类型字以避免与Java的关键字混淆。