如何创建一个只接受泛型参数而不接受原始类型参数的泛型方法?
How to create a generic method that accepts only generic parameters and not raw type parameters?
我想创建一个仅接受整数数组列表的通用方法。但该方法也接受原始类型。我怎样才能限制它只接受一个整数数组列表?
package generics;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericBox<T> {
public static void main(String[] args) {
ArrayList l1 = new ArrayList();
l1.add(1);
l1.add("subbu");
printListValues(l1);
ArrayList<Integer> l2 = new ArrayList<>();
l2.add(1);
l2.add(2);
printListValues(l2);
}
public static <T extends ArrayList<Integer>> void printListValues(T t){
System.out.println(t);
}
}
谢谢,
子部
But the method is also accepting a raw type
您是说要禁止此通话吗?
printListValues(new ArrayList()); // raw type
编译器将发出有关使用原始类型的警告,但它会编译。您也许可以告诉您的编译器(检查其文档或配置 GUI 以了解如何操作)将此视为错误,从而禁止它。
编译器通常允许这样做的原因是向后兼容。泛型是后来添加的(Java 5)并且是 "opt-in"。如果代码使用泛型类型,它们必须是正确的,但您可以完全放弃它。旧的 "raw" 代码仍然有效(这是 Java 的一个强大卖点)。
也许有一个编译器选项可以将警告转换为错误,因此您可以防止自己使用原始类型。但是你不能强迫别人那样做。
您根本无法阻止某人传递原始类型的列表。
无论好坏(如今大多是后者),原始类型都是语言中根深蒂固的一部分。没有办法摆脱他们。
但是,您的方法签名定义了一个契约:
public static void printListValues(ArrayList<Integer> t)
说 "To work correctly, I need an ArrayList
(or null). If that list is not null, I expect all of its elements to be Integer
or null; and I expect the list to be able to consume instances of Integer
or null without causing problems for the caller"。
如果您传入任何其他内容,则行为未定义:买者自负。大多数时候,编译器会阻止这种情况发生,但如果类型检查被禁用(通过使用原始类型),你就只能靠自己了。
所以,不用担心人们传递原始类型的列表。如果他们忽略您的方法的约定,并忽略来自编译器的警告,他们将得到他们应得的一切。
你可以使用很多类型,你可以指定它应该接受什么样的类型
public class GenericBox<T> {
public static void main(String[] args) {
GenericProperties genericsPropertiesOnly=new GenericProperties();
genericsPropertiesOnly.l2.add(1);
genericsPropertiesOnly.l2.add(1);
printListValues(genericsPropertiesOnly);
}
//In here i am specifying to method should accept only Generic from GenericProperties class
public static <T extends GenericProperties> void printListValues(T t){
System.out.println(t.l2);
}
}
在这里您可以指定要使用的属性类型
public class GenericProperties {
private ArrayList<Integer> list;
private ArrayList<String> listw;
ArrayList<Integer> l2 = new ArrayList<>();
}
我想创建一个仅接受整数数组列表的通用方法。但该方法也接受原始类型。我怎样才能限制它只接受一个整数数组列表?
package generics;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericBox<T> {
public static void main(String[] args) {
ArrayList l1 = new ArrayList();
l1.add(1);
l1.add("subbu");
printListValues(l1);
ArrayList<Integer> l2 = new ArrayList<>();
l2.add(1);
l2.add(2);
printListValues(l2);
}
public static <T extends ArrayList<Integer>> void printListValues(T t){
System.out.println(t);
}
}
谢谢, 子部
But the method is also accepting a raw type
您是说要禁止此通话吗?
printListValues(new ArrayList()); // raw type
编译器将发出有关使用原始类型的警告,但它会编译。您也许可以告诉您的编译器(检查其文档或配置 GUI 以了解如何操作)将此视为错误,从而禁止它。
编译器通常允许这样做的原因是向后兼容。泛型是后来添加的(Java 5)并且是 "opt-in"。如果代码使用泛型类型,它们必须是正确的,但您可以完全放弃它。旧的 "raw" 代码仍然有效(这是 Java 的一个强大卖点)。
也许有一个编译器选项可以将警告转换为错误,因此您可以防止自己使用原始类型。但是你不能强迫别人那样做。
您根本无法阻止某人传递原始类型的列表。
无论好坏(如今大多是后者),原始类型都是语言中根深蒂固的一部分。没有办法摆脱他们。
但是,您的方法签名定义了一个契约:
public static void printListValues(ArrayList<Integer> t)
说 "To work correctly, I need an ArrayList
(or null). If that list is not null, I expect all of its elements to be Integer
or null; and I expect the list to be able to consume instances of Integer
or null without causing problems for the caller"。
如果您传入任何其他内容,则行为未定义:买者自负。大多数时候,编译器会阻止这种情况发生,但如果类型检查被禁用(通过使用原始类型),你就只能靠自己了。
所以,不用担心人们传递原始类型的列表。如果他们忽略您的方法的约定,并忽略来自编译器的警告,他们将得到他们应得的一切。
你可以使用很多类型,你可以指定它应该接受什么样的类型
public class GenericBox<T> {
public static void main(String[] args) {
GenericProperties genericsPropertiesOnly=new GenericProperties();
genericsPropertiesOnly.l2.add(1);
genericsPropertiesOnly.l2.add(1);
printListValues(genericsPropertiesOnly);
}
//In here i am specifying to method should accept only Generic from GenericProperties class
public static <T extends GenericProperties> void printListValues(T t){
System.out.println(t.l2);
}
}
在这里您可以指定要使用的属性类型
public class GenericProperties {
private ArrayList<Integer> list;
private ArrayList<String> listw;
ArrayList<Integer> l2 = new ArrayList<>();
}