我已阅读有关泛型类型的文档,我知道使用它但我有一个问题“阅读”两种方法。
我使用“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 ......
答案 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
的数组)并返回List
个String
的方法。
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的关键字混淆。