java - 在这种情况下如何避免在转换为泛型时发出警告?

标签 java generics casting

避免此警告的最佳方法?有没有 (T) 转换可能失败的案例/示例? (用Eclipse编译Java语言)

更新示例以供引用 Lee 的答案:使用结果巧妙地转换失败。

interface Test {
}

class Test1 implements Test {
    void doSomething() {}
}
class Test2 implements Test {}

public class TestIterable<T extends Test> implements Iterable<T> {

    final ArrayList<T> result=new ArrayList<>();

    public TestIterable(Object obj) {
        if (obj instanceof Test) {
            Test t = (Test) obj;
            result.add((T) obj); // Warning: unchecked cast from Test to T
            // Iteresting decompilation result....
            // result.add((Test) obj);
        }
    }

    @Override
    public Iterator<T> iterator() {
        return result.iterator();
    }

    public static void main(String[] args) {
        TestIterable<Test1> x = new TestIterable<>(new Test2());
        for (Test1 y :x.result) {
            y.doSomething();
            // java.lang.ClassCastException
        };
    }
}

最佳答案

两种选择。 需要 T 对象的自然解决方案可能不符合您的需求。然后必须显式传递类型 T,因为类型删除会使任何其他构造变得毫无意义。

class TestIterable<T extends Test> implements Iterable<T> {

    final List<T> result = new ArrayList<>();

    public TestIterable(T obj) {
        result.add(obj);
    }

    public TestIterable(Class<T> type, Object obj) {
        if (obj == null || type.isAssignableFrom(obj.getClass())) {
            result.add(type.cast(obj));
        }
    }

    @Override
    public Iterator<T> iterator() {
        return result.iterator();
    }
}

关于java - 在这种情况下如何避免在转换为泛型时发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54769562/

相关文章:

Java-重写泛型接口(interface)方法时如何获取具体参数类型

c++将 union 转换为其成员类型之一

java.lang.ClassNotFoundException : org. neo4j.ogm.drivers.embedded.driver.EmbeddedDriver 问题

java - 如何使用线程执行单元测试?

Java 将参数约束到公共(public)父类(super class)

java - 将字符串转换为整数成员,可能吗?

c# - 对象在转换为接口(interface)时必须实现 IConvertible (InvalidCastException)

java - 如何使用 RestFul Web 服务在 java 中打印请求响应中的属性?

java - 在 Apache Felix gogo shell 中按名称搜索包

java - 为什么我的双层 map 不起作用?