Java警告的含义是什么?
类型安全:从对象到列表的强制转换实际上是针对已擦除类型列表进行检查
当我尝试将Object转换为具有通用信息的类型时,我收到此警告,例如在以下代码中:
Object object = getMyList();
List<Integer> list = (List<Integer>) object;
Run Code Online (Sandbox Code Playgroud) 为什么以下代码会出现编译错误?
public MyObject(Builder<? extends MyObject> builder) {
// Type mismatch: cannot convert from MyObject.Builder<capture#5-of ? extends MyObject> to MyObject.Builder<MyObject>
Builder<MyObject> myObjBuilder = builder;
}
Run Code Online (Sandbox Code Playgroud)
如果Builder类型是MyObject的子类,那么为什么不能将构建器指定为仅键入MyObject?我需要这样做,因为我无法使用构建器的MyObject类型的对象.看一下这段代码,例如:
public MyObject(Builder<? extends MyObject> builder) {
// The method getData(capture#8-of ? extends MyObject) in the type Builder<capture#8-of ? extends MyObject> is not applicable for the arguments (MyObject)
this.data = builder.getData(this);
}
Run Code Online (Sandbox Code Playgroud)
我觉得应该允许这样做.或者我在这里遗漏了什么?有没有办法在不(Builder<MyObject>)使用构建器和必须使用@SuppressWarnings的情况下执行此操作?
还要注意我需要Builder,<? extends MyObject>因为MyObject及其Builder将被子类化(因为它是抽象的).
谢谢你的帮助!
我对以下代码感到困惑:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericsTest<T extends List> {
public void foo() {
T var = (T) new LinkedList();
}
public static void main(String[] args) {
GenericsTest<ArrayList> gt1 = new GenericsTest<ArrayList>();
gt1.foo();
System.out.println("Done");
}
}
Run Code Online (Sandbox Code Playgroud)
无论我传递给构造函数的Type参数如何,运行时类型T似乎都是java.util.List.
那么为什么编译器T在分配var时需要转换?它不应该在编译时知道LinkedList可分配给List吗?
我理解代码是假的,我理解为什么它在运行时工作,即使它看起来不应该.令我困惑的部分是为什么编译器要求我在进行赋值时键入(T)?然而,如果没有伪造的话,它可以很好地编译.
据推测,编译器理解擦除.看起来编译器应该能够在没有强制转换的情况下编译代码.