是否有将通用类型参数约束为 任何 类型范围的语法或解决方法?
我知道您可以将一个类型限制为 所有 类型的范围(即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())。