相关疑难解决方法(0)

在某些Java泛型演员表中类型安全警告的含义是什么?

Java警告的含义是什么?

类型安全:从对象到列表的强制转换实际上是针对已擦除类型列表进行检查

当我尝试将Object转换为具有通用信息的类型时,我收到此警告,例如在以下代码中:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
Run Code Online (Sandbox Code Playgroud)

java generics warnings casting type-safety

68
推荐指数
1
解决办法
8460
查看次数

Java Generics - 无法转换<?将MyObject>扩展为<MyObject>

为什么以下代码会出现编译错误?

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将被子类化(因为它是抽象的).

谢谢你的帮助!

java generics

6
推荐指数
1
解决办法
3125
查看次数

被Java泛型混淆需要强制转换

我对以下代码感到困惑:

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)?然而,如果没有伪造的话,它可以很好地编译.

据推测,编译器理解擦除.看起来编译器应该能够在没有强制转换的情况下编译代码.

java generics casting

3
推荐指数
2
解决办法
1095
查看次数

标签 统计

generics ×3

java ×3

casting ×2

type-safety ×1

warnings ×1