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 ......
<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
),并返回一个List
的String
第
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)
归档时间: |
|
查看次数: |
1183 次 |
最近记录: |