【问题标题】:How to read this: public <T> T[] toArray(T[] array);如何阅读: public <T> T[] toArray(T[] array);
【发布时间】:2016-07-16 18:18:52
【问题描述】:

我已阅读有关泛型类型的文档并且知道使用它,但我在“阅读”两种方法时遇到了问题。

我使用“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){

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

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

编译器认为这些方法与其他方法不同,因为如果 y delete

<String>

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

我无法感谢您的回复。

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

我有一些新信息...在 Oracle 文档中存在这个:

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

}

这句话,每次都是……¿¿建议??我没有任何班级呼叫“迈克”或“彼得”
&lt;Mike&gt; &lt;Peter&gt;

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

然后我需要确认一下,静态(或公共,如果不是静态方法)之后的词只是一个“建议”。

谢谢!!

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

与之前的疑问相关的新问题。

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

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

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

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

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

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

【问题讨论】:

  • 我认为是合乎逻辑的不,它不是,因为public &lt;Integer&gt; void testClass(String[] array) 工作正常。当您在那里遇到错误时,这与您放置的课程有关。看起来已经有一个 testClass(String[]) 方法,这显然行不通。

标签: java arrays inheritance arraylist collections


【解决方案1】:

&lt;T&gt;不是返回类型,是泛型类型参数T的声明,可能出现在返回类型之前。

public &lt;T&gt; T[] toArray(T[] array)

T[]是返回类型,表示toArray接受一个泛型数组,返回一个相同类型的泛型数组。

&lt;String&gt; List&lt;String&gt; toArray(String[] array) 中,&lt;String&gt; 是泛型类型参数(List&lt;String&gt; 是返回类型),这很容易混淆,因为它隐藏了java.lang.String 类。 完全等同于&lt;T&gt; List&lt;T&gt; toArray(T[] array)

编辑:

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

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

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

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

这两种方法有不同的参数,尽管看起来它们没有。

当您使用String[] 参数调用testClass 时,将调用接受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

【讨论】:

  • 直到现在我知道“T[] toArray....”是返回类型,我知道“...ToArray(T[])”是参数类型,但我不知道了解哪些 adicional 信息有助于“”。在 public String[] toArray(String[] array) 在我看来 剩下了。你说 是一个泛型类型,但你在这里有一个泛型类型“T[] 数组”,我认为足够了,如果你离开 ,该方法将运行,我认为......我需要更多解释,对不起:-(
  • @Marquake 如果不使用&lt;T&gt; 声明泛型类型,编译器会假定T 是某个类或接口的名称,如果找不到类或接口使用该名称,它会给你一个错误。
  • 我添加了一个新示例。谢谢!
  • 我刚试了一下,你的代码很清晰。方法之间存在差异。我几乎明白了......你说“String”不完全是java.lang.String,是一个引用类型。我认为这是关键。如果在方法中将“Object”作为泛型类型,我可以理解它,因为 Integer 是 Object 的子类型,但放入 String。我认为您正在尝试说 String 是一种说“通用”的方式。我在谷歌搜索,我找不到可以阅读这个主题的地方......我想,我已经接近理解了......非常感谢!
  • @Marquake 当标识符字符串出现在&lt;&gt; 中时,它就变成了一个泛型类型参数。不是java.lang.String。因此public static &lt;String&gt; List&lt;String&gt; testClass(String[] array) 行与public static &lt;WhateverYouDecideToWriteHere&gt; List&lt;WhateverYouDecideToWriteHere&gt; testClass(WhateverYouDecideToWriteHere[] array) 相同。
【解决方案2】:

如果您在“idea”或其他 IDE 中编辑测试代码,您会看到第一种方法和第二种方法之间的“String”颜色不同。这意味着编译器会处理第一个“String”而不是“java.lang.String”。它只是一个像 T、E 或任何其他词之类的词。我认为也许 Java 应该让编译器检查泛型类型词以避免与 Java 的关键字混淆。

【讨论】:

  • 对!我已经安装了IDEA,我刚刚做了一个测试,颜色不一样。其中的一部分...在 Eclipse 中,如果在第二种情况下将 F3 推到单词“String”上,请转到“public final class String implements Serializable, Comparable, CharSequence {”。如果您在第一种情况下按 F3,则无处可去。使用像 T 和 E 这样的字符串有点令人困惑......我仍在搜索有关此的信息。我不完全理解“public static List testClass(String[] array)”。谢谢!您的评论有所贡献。
猜你喜欢
  • 2014-12-12
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2013-03-31
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多