1時目
あなたは、クラスを定義する場合は1、インターフェイスタイプのパラメータが使用されていませんが、タイプのパラメータを定義する方法を定義したいと思い、それはJDK1.5もジェネリックメソッドのサポートを提供し、また可能です。
2次のように一般的な方法の構文は次のとおりです。
修飾子<T、S>戻り値の型メソッド名(パラメータリスト)
{
//メソッド本体...
}
方法離間型の複数のパラメータとの間の従来の方法の型パラメータの宣言、角括弧宣言におけるパラメータの種類、カンマ(、)の署名方式より3ジェネリックメソッドシグネチャ、すべてのタイプのパラメータが宣言します値の型を返すためのメソッドとメソッドの修飾。
そして、クラス4、明示的に実際の型引数に渡さずに、異なるパラメータを使用して、一般的なインターフェース、汎用パラメータの方法、値型パラメータ引数推定に基づいているため、コンパイラ。これは通常、パラメータの種類を推測するのが最も簡単です。
5回ではなく、ワイルドカード方式の一般的なタイプで使用することができます。
図6は、ジェネリックメソッドの型パラメータは、1つまたは複数のメソッドのパラメータ、またはパラメータの値との間のメソッドの戻り型の依存関係との間の依存関係の種類を示すために使用されることができます。依存関係のないようなタイプが存在しない場合、我々は一般的な方法を使用しないでください。
二つの戦闘
import java.util.*;
public class GenericMethodTest
{
// 声明一个泛型方法,该泛型方法中带一个T类型形参,
static <T> void fromArrayToCollection(T[] a, Collection<T> c)
{
for (T o : a)
{
c.add(o);
}
}
public static void main(String[] args)
{
Object[] oa = new Object[100];
Collection<Object> co = new ArrayList<>();
// 下面代码中T代表Object类型
fromArrayToCollection(oa, co);
String[] sa = new String[100];
Collection<String> cs = new ArrayList<>();
// 下面代码中T代表String类型
fromArrayToCollection(sa, cs);
// 下面代码中T代表Object类型
fromArrayToCollection(sa, co);
Integer[] ia = new Integer[100];
Float[] fa = new Float[100];
Number[] na = new Number[100];
Collection<Number> cn = new ArrayList<>();
// 下面代码中T代表Number类型
fromArrayToCollection(ia, cn);
// 下面代码中T代表Number类型
fromArrayToCollection(fa, cn);
// 下面代码中T代表Number类型
fromArrayToCollection(na, cn);
// 下面代码中T代表Object类型
fromArrayToCollection(na, co);
// 下面代码中T代表String类型,但na是一个Number数组,
// 因为Number既不是String类型,
// 也不是它的子类,所以出现编译错误
// fromArrayToCollection(na, cs);
}
}
間違いの使用状況
import java.util.*;
public class ErrorTest
{
// 声明一个泛型方法,该泛型方法中带一个T类型形参,两个参数类型必须一致
static <T> void test(Collection<T> from, Collection<T> to)
{
for (T ele : from)
{
to.add(ele);
}
}
public static void main(String[] args)
{
List<Object> as = new ArrayList<>();
List<String> ao = new ArrayList<>();
// 下面代码将产生编译错误,传参类型不一致,编译器迷惑了
// test(as , ao);
}
}
四の正しい使い方
import java.util.*;
public class RightTest
{
// 声明一个泛型方法,该泛型方法中带一个T形参
static <T> void test(Collection<? extends T> from , Collection<T> to)
{
for (T ele : from)
{
to.add(ele);
}
}
public static void main(String[] args)
{
List<Object> ao = new ArrayList<>();
List<String> as = new ArrayList<>();
// 下面代码完全正常,因为前一个集合的元素类型是后一个集合元素类型的子类型
test(as , ao);
}
}