避免此警告的最佳方法?有没有 (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/