Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将泛型类型分配给类类型的变量_Java_Instanceof - Fatal编程技术网

Java 将泛型类型分配给类类型的变量

Java 将泛型类型分配给类类型的变量,java,instanceof,Java,Instanceof,我怎样才能实现我想要的,即分配一个模式而不是一个简单的类型? 如果Java中不允许,是否有其他合适的方法来测试变量是否是定义为模式的类型的实例?编译后泛型将被删除。 因此,即使此代码有效,也无法进一步帮助您: Class clazz = Long.class; // this works fine 我认为这应该重新考虑你的逻辑。 泛型主要是为了提高类型安全性而设计的,它机械地降低了对测试和降级的实例的要求 如果Java中不允许,是否有其他合适的方法来测试 变量是定义为模式的类型的实例 通过在泛

我怎样才能实现我想要的,即分配一个模式而不是一个简单的类型?
如果Java中不允许,是否有其他合适的方法来测试变量是否是定义为模式的类型的实例?

编译后泛型将被删除。
因此,即使此代码有效,也无法进一步帮助您:

Class clazz = Long.class; // this works fine
我认为这应该重新考虑你的逻辑。
泛型主要是为了提高类型安全性而设计的,它机械地降低了对测试和降级的
实例的要求

如果Java中不允许,是否有其他合适的方法来测试 变量是定义为模式的类型的实例

通过在泛型类中添加
class
字段,可以存储泛型实例中指定的类型。但当您使用内置类型时,您会被卡住。
使用您自己的类,您可以通过以下方式捕获信息,例如:

if (clazz.isInstance(myVariable)) {
    // do something
}
公共类Foo{
私有映射映射=新的HashMap();
私有类tClass;
私家舱;
私有类vClass;
公共食品(t类、u类、v类){
this.tClass=t;
this.uClass=u;
这个.vClass=v;
}
}
因此,您可以使用
tClass
uClass
vClass
执行所需的检查。

但是如上所述,继续这样做可能不是最好的办法。

您无法检查是否有
HashMap
的实例

尽管语法暗示
HashMap
是一个单独的东西,但该类型实际上意味着:

  • 这种类型的变量在运行时将保存一个
    HashMap
    (或null)
  • 如果我试图放入或取出一个非
    长的
    键,我希望编译器阻止我,如果我试图放入或取出任何非
    HashMap
    的键和值属于该特定类型,编译器也会阻止我
s之间的位纯粹是编译时提示。在运行时没有什么可测试的

如果映射不是空的,您可以检查它是否包含任何违反类型约束的键或值


但是,除了只能在映射为非空且包含非空键和值时执行此操作外,它不会告诉您它是否是
HashMap
,而是告诉您它是
HashMap,我认为这是不可能的,因为运行时类型擦除。我需要它以便以后能够在.isInstance()表达式中使用它,-因为您将无法在运行时根据泛型类型验证实例。进一步阅读:您还可能希望阅读:
HashMap<Long, HashMap<String, Semaphore>> map = new HashMap<>();
Class<?> clazz = map.getClass();
if (clazz.isInstance(myVariable)) {
    // do something
}
public class Foo<T, U, V> {

    private Map<T, HashMap<U, V>> map = new HashMap<>();
    private Class<T> tClass;
    private Class<U> uClass;
    private Class<V> vClass;

    public Foo(Class<T> t, Class<U> u, Class<V> v) {
        this.tClass = t;
        this.uClass = u;
        this.vClass = v;
    }

}