【发布时间】: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){
}
}
这句话,每次都是……¿¿建议??我没有任何班级呼叫“迈克”或“彼得”<Mike>
<Peter>
如果我离开,前面的代码会编译。我想那是因为如果我在 之间放一些东西可能是一个真实的类型。
然后我需要确认一下,静态(或公共,如果不是静态方法)之后的词只是一个“建议”。
谢谢!!
===================== 编辑 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 <Integer> void testClass(String[] array)工作正常。当您在那里遇到错误时,这与您放置的课程有关。看起来已经有一个testClass(String[])方法,这显然行不通。
标签: java arrays inheritance arraylist collections