Java 有没有办法为具有标识方法的泛型类创建通用单例?
我有一个简单的界面:Java 有没有办法为具有标识方法的泛型类创建通用单例?,java,generics,Java,Generics,我有一个简单的界面: public interface Constraint<T> { T constrain(T unconstrainedValue); } 您可以使用不安全的强制转换来执行此操作,您知道这是安全的: static class NoConstraint<T> implements Constraint<T> { private static final Constraint rawInstance = new NoCons
public interface Constraint<T> {
T constrain(T unconstrainedValue);
}
您可以使用不安全的强制转换来执行此操作,您知道这是安全的:
static class NoConstraint<T> implements Constraint<T> {
private static final Constraint rawInstance = new NoConstraint();
public static <T> Constraint<T> instance() {
@SupressWarnings("unchecked")
Constraint<T> generic = rawInstance;
return generic;
}
@Override
public T constrain(T unconstrainedValue) {
return unconstrainedValue;
}
}
静态类NoConstraint实现约束{
私有静态最终约束rawInstance=new NoConstraint();
公共静态约束实例(){
@超级警告(“未选中”)
约束generic=rawInstance;
返回泛型;
}
@凌驾
公共T约束(T无约束值){
返回无约束值;
}
}
不用说,只有当你向自己证明它总是安全的时候,你才应该这样做(在这种情况下,这可能很容易做到)
在这种情况下,这不是一个罕见的伎俩。例如,(和该类中的类似方法)使用这种技术
还请注意,
instance()
方法中的T
与约束中的T
不同,尽管它们共享相同的名称。约束的T
仅在实例上下文中可用,而在静态上下文中不可用,因此我们必须为静态方法声明一个通用参数。大多数时候,像这样隐藏名字是危险的;在这种情况下,我发现它很有用,可以作为一个视觉提醒,就典型用户而言,T
s都是紧密相连的。您可以使用不安全的强制转换来实现这一点,您知道这是安全的:
static class NoConstraint<T> implements Constraint<T> {
private static final Constraint rawInstance = new NoConstraint();
public static <T> Constraint<T> instance() {
@SupressWarnings("unchecked")
Constraint<T> generic = rawInstance;
return generic;
}
@Override
public T constrain(T unconstrainedValue) {
return unconstrainedValue;
}
}
静态类NoConstraint实现约束{
私有静态最终约束rawInstance=new NoConstraint();
公共静态约束实例(){
@超级警告(“未选中”)
约束generic=rawInstance;
返回泛型;
}
@凌驾
公共T约束(T无约束值){
返回无约束值;
}
}
不用说,只有当你向自己证明它总是安全的时候,你才应该这样做(在这种情况下,这可能很容易做到)
在这种情况下,这不是一个罕见的伎俩。例如,(和该类中的类似方法)使用这种技术
还请注意,instance()
方法中的T
与约束中的T
不同,尽管它们共享相同的名称。约束的T
仅在实例上下文中可用,而在静态上下文中不可用,因此我们必须为静态方法声明一个通用参数。大多数时候,像这样隐藏名字是危险的;在这种情况下,我发现它很有用,可以作为一个视觉提醒,就典型用户而言,T
s都是紧密相连的。您可以使用不安全的强制转换来实现这一点,您知道这是安全的:
static class NoConstraint<T> implements Constraint<T> {
private static final Constraint rawInstance = new NoConstraint();
public static <T> Constraint<T> instance() {
@SupressWarnings("unchecked")
Constraint<T> generic = rawInstance;
return generic;
}
@Override
public T constrain(T unconstrainedValue) {
return unconstrainedValue;
}
}
静态类NoConstraint实现约束{
私有静态最终约束rawInstance=new NoConstraint();
公共静态约束实例(){
@超级警告(“未选中”)
约束generic=rawInstance;
返回泛型;
}
@凌驾
公共T约束(T无约束值){
返回无约束值;
}
}
不用说,只有当你向自己证明它总是安全的时候,你才应该这样做(在这种情况下,这可能很容易做到)
在这种情况下,这不是一个罕见的伎俩。例如,(和该类中的类似方法)使用这种技术
还请注意,instance()
方法中的T
与约束中的T
不同,尽管它们共享相同的名称。约束的T
仅在实例上下文中可用,而在静态上下文中不可用,因此我们必须为静态方法声明一个通用参数。大多数时候,像这样隐藏名字是危险的;在这种情况下,我发现它很有用,可以作为一个视觉提醒,就典型用户而言,T
s都是紧密相连的。您可以使用不安全的强制转换来实现这一点,您知道这是安全的:
static class NoConstraint<T> implements Constraint<T> {
private static final Constraint rawInstance = new NoConstraint();
public static <T> Constraint<T> instance() {
@SupressWarnings("unchecked")
Constraint<T> generic = rawInstance;
return generic;
}
@Override
public T constrain(T unconstrainedValue) {
return unconstrainedValue;
}
}
静态类NoConstraint实现约束{
私有静态最终约束rawInstance=new NoConstraint();
公共静态约束实例(){
@超级警告(“未选中”)
约束generic=rawInstance;
返回泛型;
}
@凌驾
公共T约束(T无约束值){
返回无约束值;
}
}
不用说,只有当你向自己证明它总是安全的时候,你才应该这样做(在这种情况下,这可能很容易做到)
在这种情况下,这不是一个罕见的伎俩。例如,(和该类中的类似方法)使用这种技术
还请注意,instance()
方法中的T
与约束中的T
不同,尽管它们共享相同的名称。约束的T
仅在实例上下文中可用,而在静态上下文中不可用,因此我们必须为静态方法声明一个通用参数。大多数时候,像这样隐藏名字是危险的;在这种情况下,我发现它很有用,可以直观地提醒用户,就典型用户而言,两个T
s是紧密相连的。return T不起作用,因为您需要返回一个对象而不是类型。也许你的意思是返回无约束值。原来的问题也是同样的问题。@WillShackleford啊,是的,谢谢——我只是抄了那一点。:)将修复它。您应该添加一个私有构造函数,这样类就不能被实例化,而return t将无法工作,因为您需要返回一个对象而不是类型。也许你的意思是返回无约束值。原来的问题也是同样的问题。@WillShackleford啊,是的,谢谢——我只是抄了那一点。:)将修复它。您应该添加一个私有构造函数,这样该类就不能在其他地方实例化,而return t将不起作用