Java 如何将列表元素转换为其超级类型?

Java 如何将列表元素转换为其超级类型?,java,collections,casting,Java,Collections,Casting,假设我有以下几点: class MyType<T> { // ... } private void test() { Set<MyType<? extends Serializable>> in; Set<MyType<Serializable>> out; } 在Java7中,有没有一种更优雅的方法可以做到这一点,而不使用add循环或脏/不可选中的强制转换 在Java7中,有没有一种更优雅的方法可以做到这

假设我有以下几点:

class MyType<T> {
    // ...
}

private void test() {
    Set<MyType<? extends Serializable>> in;
    Set<MyType<Serializable>> out; 
}
在Java7中,有没有一种更优雅的方法可以做到这一点,而不使用add循环或脏/不可选中的强制转换

在Java7中,有没有一种更优雅的方法可以做到这一点,而不使用add循环或脏/不可选中的强制转换

不,因为你正在做一些类型不安全的事情


您正在尝试处理MyTypeout=newhashsetin;这是合法的。我不知道你为什么认为不是。我也一样,为什么不试试呢?试试addAllmethod@EmreAcar这也会起作用,但仍然是多余的。out=新HashSetin;这不是上档,这是下档。在扩展的情况下,对象始终可以安全地向下转换为它扩展的类型。即对象o=对象任意项;总是允许的,因为任何东西都会在某个点扩展对象。当然,它是允许的,但它不安全。它是绝对安全的。如果将任何对象向下转换为超级类型,则在任何时候都不会导致问题。这是OOP的基本原理。@Two它是不安全的,编译器通过拒绝编译给您一个非常强烈的指示。示例循环编译得很好,没有任何错误。
out = new HashSet<>();
for (MyType<? extends Serializable> s : in) {
    out.add((MyType<Serializable>) s);
}
class MyType<T> {
  T field;
  void set(T field) { this.field = field; }
  T get() { return field; }
}
MyType<String> str = new MyType<>();
MyType<Serializable> ser = (MyType<Serializable>) str;
ser.set(Integer.valueOf(0));
String got = str.get();