如何将List元素转换为它的超类型?

时间:2018-03-07 08:59:27

标签: java collections casting

假设我有以下内容:

im.h

然后以下分配是非法的:class MyType<T> { // ... } private void test() { Set<MyType<? extends Serializable>> in; Set<MyType<Serializable>> out; } out = new HashSet<>(in);也是非法的, 因为它不能被隐式转换。然而,以下内容完全合法:

out.addAll(in)

在不使用add-loop或dirty / uncheckable强制转换的情况下,是否有更优雅的方法在Java 7中执行此操作?

1 个答案:

答案 0 :(得分:2)

  

在不使用add-loop或dirty / uncheckable强制转换的情况下,是否有更优雅的方法在Java 7中执行此操作?

不,因为您正在做一些不安全的事情。

您尝试将MyType<? extends Serializable>视为MyType<Serializable> - 它不是:MyType<Serializable>MyType<? extends Serializable>,而不是其他MyType<String>四处走动。

例如,MyType<? extends Serializable>MyType<Serializable>,但它不是MyType

除非您可以在MyType<Serializable>上提供一个方法来进行演员(并且您将在那里进行未经检查的演员),或者提供一种方法来为您提供MyType<? extends Serializable> MyType,你只需要与其他地方未经检查的演员一起生活。

你还没有在class MyType<T> { T field; void set(T field) { this.field = field; } T get() { return field; } } 上定义任何方法,但是让我们说它有一个吸气剂和一个二传手:

MyType<String> str = new MyType<>();

现在,让我们假设您已获得此代码:

MyType<Serializable>

如果将其转换为Serializable,则可以使用实现MyType<Serializable> ser = (MyType<Serializable>) str; ser.set(Integer.valueOf(0)); 的任何内容调用setter:

String got = str.get();

你现在遇到了麻烦,因为:

ClassCastException

将抛出T

你声称的演员是绝对安全的&#34;不是。只有在类中没有使用参数url = "http://localhost:3000/sample_page" mail = MailFactory.new() mail.to = ApplicationController.admin_user_email mail.from = "from_eail" mail.subject = subject mail.text = "Hi, view_context.link_to(Test, url)" 的消费者方法时才是安全的;并且编译器没有考虑是否存在任何方法来确定某些东西是否是类型安全的。

因此,此演员应该产生警告;如果它没有,那么,这并不意味着它实际上是安全的,它只是意味着编译器没有考虑这种情况,或者你是在抑制警告。