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将不起作用