atp*_*atp 63 java generics parameters
我想知道是否可以编写一个接受多种泛型类型的函数,如下所示:
public int void myfunction(Set<T> a, Set<T> b) {
return 5;
}
Set<Integer> setA = new HashSet<Integer>();
Set<String> setB = new HashSet<String>();
int result = myfunction(setA, setB);
Run Code Online (Sandbox Code Playgroud)
那会有用吗?每个参数中的泛型是否意味着每个参数必须具有相同的通用类型T?
谢谢!
oxb*_*kes 112
是的 - 这是可能的(虽然不是你的方法签名),是的,你的签名类型必须相同.
使用您提供的签名,T必须与呼叫站点上的单个类型(例如String 或 Integer)相关联.但是,您可以声明采用多个类型参数的方法签名
public <S, T> void func(Set<S> s, Set<T> t)
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的签名中我已经声明了类型S和T签名本身.因此,它们与包含该函数的类或接口相关联的任何泛型类型不同并且独立.
public class MyClass<S, T> {
public void foo(Set<S> s, Set<T> t); //same type params as on class
public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}
Run Code Online (Sandbox Code Playgroud)
您可能希望查看java.util包中集合类的一些方法签名.泛型实际上是一个相当复杂的主题,特别是考虑到通配符(? extends和? super)时.例如,通常情况下,可能采用a Set<Number>作为参数的方法也应该接受a Set<Integer>.在这种情况下,你会看到这样的签名:
public void baz(Set<? extends T> s);
Run Code Online (Sandbox Code Playgroud)
关于这个问题,你已经有很多关于SO的问题!
不知道int从函数返回的是什么,尽管你可以这样做,如果你想!
您可以在类型或方法上声明多个类型变量.例如,在方法上使用类型参数:
<P, Q> int f(Set<P>, Set<Q>) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更重要的是,你可以继承泛型:)
@SuppressWarnings("unchecked")
public <T extends Something<E>, E extends Enum<E> & SomethingAware> T getSomething(Class<T> clazz) {
return (T) somethingHolderMap.get(clazz);
}
Run Code Online (Sandbox Code Playgroud)
小智 8
您可以遵循以下方法之一:
1) 基本型,单一型:
//One type
public static <T> void fill(List <T> list, T val) {
for(int i=0; i<list.size(); i++){
list.set(i, val);
}
}
Run Code Online (Sandbox Code Playgroud)
2)多种类型:
// multiple types as parameters
public static <T1, T2> String multipleTypeArgument(T1 val1, T2 val2) {
return val1+" "+val2;
}
Run Code Online (Sandbox Code Playgroud)
3) 下面将引发编译器错误,因为 'T3 不在函数声明部分使用的泛型类型列表中。
//Raised compilation error
public static <T1, T2> T3 returnTypeGeneric(T1 val1, T2 val2) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正确:编译正常
public static <T1, T2, T3> T3 returnTypeGeneric(T1 val1, T2 val2) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例类代码:
package generics.basics;
import java.util.ArrayList;
import java.util.List;
public class GenericMethods {
/*
Declare the generic type parameter T in this method.
After the qualifiers public and static, you put <T> and
then followed it by return type, method name, and its parameters.
Observe : type of val is 'T' and not '<T>'
* */
//One type
public static <T> void fill(List <T> list, T val) {
for(int i=0; i<list.size(); i++){
list.set(i, val);
}
}
// multiple types as parameters
public static <T1, T2> String multipleTypeArgument(T1 val1, T2 val2) {
return val1+" "+val2;
}
/*// Q: To audience -> will this compile ?
*
* public static <T1, T2> T3 returnTypeGeneric(T1 val1, T2 val2) {
return 0;
}*/
public static <T1, T2, T3> T3 returnTypeGeneric(T1 val1, T2 val2) {
return null;
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
System.out.println(list.toString());
fill(list, 100);
System.out.println(list.toString());
List<String> Strlist = new ArrayList<>();
Strlist.add("Chirag");
Strlist.add("Nayak");
System.out.println(Strlist.toString());
fill(Strlist, "GOOD BOY");
System.out.println(Strlist.toString());
System.out.println(multipleTypeArgument("Chirag", 100));
System.out.println(multipleTypeArgument(100,"Nayak"));
}
}
Run Code Online (Sandbox Code Playgroud)
// 类定义结束
示例输出:
[10, 20]
[100, 100]
[Chirag, Nayak]
[GOOD BOY, GOOD BOY]
Chirag 100
100 Nayak
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110479 次 |
| 最近记录: |