当前位置: 首页 > 面试题库 >

Java泛型参数绑定到任何类型的范围

牛凌
2023-03-14
问题内容

是否有将通用类型参数约束为 任何 类型范围的语法或解决方法?

我知道您可以将一个类型限制为 所有 类型的范围(即AND逻辑):

public class MyClass<T extends Comparable<T> & Serializable> { } // legal syntax

是否有OR逻辑版本,例如:

public class MyClass<T extends Comparable<T> | Serializable> { } // illegal syntax

如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法?

在某些情况下,一个示例用例可能是:

/** @return true if the obj is either has the same id, or if obj is the same as id */
public <T extends MyClass | String> boolean sameAs(T obj) {
    if (obj instanceof String) return this.id.equals(obj);
    if (obj instanceof MyClass) return this.id.equals(((MyClass)obj).id);
    return false;
}

人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下:

public class MyWrapper<T extends A | B> {
    // my class can wrap A or B (unrelated classes). Yes I will probably use instanceof
}

编辑:
我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体的类。另外,我必须将我的类交给一个调用我的class.method的外部系统,但是另一个系统可以给我各种类的实例,但是它们的
定义定义都 比较 狭窄

有人评论说instanceof“不纯正”。好的,一种解决方法是使用工厂方法根据传入对象的类来选择我的具体类,但是必须使用该工厂方法instanceof,因此您只需将其移动instanceof到另一个位置-
您仍然需要instanceof

还是这个想法永远不是一个好主意?


问题答案:

不会。除非所有类型都具有非空的联合类型(例如,它们都实现了一个接口或它们都扩展了一个基类),否则这没有任何意义,在这种情况下,您只需指定联合类型即可。



 类似资料:
  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 我正在开发一个小的android演示应用程序,其中混合了一些java类和接口与kotlin。我想从一个名为MvpViewStateActivity的具有泛型类型参数的java类扩展: 其中只是一个空的java接口: MvpPresenter是这样一个java接口: 和SearchViewActivity(Java): 所以现在我创建了一个kotlin接口: 其中,Item是pojo数据类。 也是用

  • 我正在开发一个基于JAX-RS的Java应用程序,使用Google Guice进行依赖注入。我的代码中有以下接口: 在上面的接口中,Lock是一个定义如下的接口: 锁接口由以下类实现: LockProvider接口由以下类实现: 除了LockProvider之外,我不希望应用程序中的类知道底层锁项,这就是为什么我没有在lock接口中包含getUnderlyingLockItem。 现在,当我尝试将

  • 问题内容: 我正在定义一个类: 编译器抱怨被隐藏。我猜第二次出现在定义中是第一次隐藏在范围内,好像可以将变量分配给两种不同的类型一样。如何正确做? 编辑: 这是一个内部阶级。完整的代码可以是: 现在的问题是,如果我重新提名内部人,我不确定那是和实际上是相同的类型。 问题答案: 不要将内部类参数化: 作为声明中定义的内部(非静态嵌套)类,仍将具有in的含义,因为每个类都对其外部实例具有隐式引用。

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。