我有自定义课程ListA
public class ListA<T> { ... }
使用方法插入
public void insert(T value) {
array[0] = value;
}
我按照这样创建我的ListA
:
ListA list = null;
list = new ListA<Integer>();
为什么我可以将字符串添加到列表中?
list.insert("abc");
工作正常,如果我打印它,我可以看到abc
。有没有办法禁止除<>
<Integer>
之外的所有类型?
答案 0 :(得分:1)
以下是快速字节,可以尝试为您的常规知识添加更多内容,这将解决您的问题:
此ListA list = null;
只是说list
是ListA
类型的变量。现在,因为您已将类创建为“泛型类型”public class ListA<T>
,即使用“类型参数”,所以每当您说ListA list = null;
时它就会变成一个“原始类型”,如果您创建了没有任何类型参数的类,例如public class ListA
,那么如果您执行ListA list = null;
那么它将不会被称为“原始类型” “并且将被视为简单类型声明,因为您的类不是泛型类型。
现在,这个list = new ListA<Integer>();
只是你正在创建一个“参数化类型”对象并将其分配给list
,这是一个原始类型,所以@JonSkeet有已经评论过你的编译器会给你一个警告,除非你使用 -Xlint:-unchecked
标志来抑制警告。
现在,您可以执行list.insert("abc");
,因为您的list
ORV是原始类型,回想一下重要的事实,即在编译时编译器检查变量类型以决定所有方法可以打电话给ORV,是否打破了类型安全。现在,由于list
ORV是一个原始类型,所以即使list.insert(new MyClass());
也是允许的,基本上你可以放任何对象,因为public class ListA<T>
意味着ListA可以是任何类型的对象的sybtype。 public class ListA<T>
和public class ListA<T extends Object>
从其中一条评论到您的问题,看起来您正在寻找 bounded parameter ,因此如果您需要,您应该能够插入任何类型为{{的子类型1}}然后你应该说Number
。如果您希望插入数字和字符串,那么您的情况会发生什么,因为即使使用public class ListA<T extends Number>
,您也无法插入字符串或任何其他不属于public class ListA<T extends Number>
的子类型} p>
我建议阅读我提供的有界参数链接,以获得深入的了解。