通用允许错误的类型

时间:2017-05-18 08:22:20

标签: java generics

我有自定义课程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>之外的所有类型?

1 个答案:

答案 0 :(得分:1)

以下是快速字节,可以尝试为您的常规知识添加更多内容,这将解决您的问题:

ListA list = null;只是说listListA类型的变量。现在,因为您已将类创建为“泛型类型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>的子类型

我建议阅读我提供的有界参数链接,以获得深入的了解。