【问题标题】:Generic class as argument泛型类作为参数
【发布时间】:2014-05-02 11:59:14
【问题描述】:

我有一个通用类 Card 。 Rank是接口

class Card<T extends Enum<T> & Rank>

我正在尝试创建两个 Card 的静态比较器。

public final static Comparator<Card<?>> comparatorByAttribute1 = new Comparator<Card<?>>() { 
     @Override
     public int compare(Card<?> o1, Card<?> o2) 
     { 
       ... 
     } 
}; 

如何定义 o1 的类型应该与 o2 相同?

【问题讨论】:

  • 为什么这个问题被否决了?这不是一个坏问题

标签: java generics comparator anonymous-class


【解决方案1】:

为什么不在类型声明中使用实际类型?

public final static Comparator<Card<ActualType>> comparatorByAttribute1 = 
    new Comparator<Card<ActualType>>() {

        @Override
        public int compare(Card<ActualType> o1, Card<ActualType> o2) {
            return 0;
        }
    };

随着...

public enum ActualType implements Rank {...}

或者,如果您想保留泛型类型&lt;T&gt;,则需要使用泛型静态方法,因为在 Java 中没有泛型属性:

public final static <T extends Enum<T> & Rank> Comparator<Card<T>> 
    comparatorByAttribute1() {
    return new Comparator<Card<T>>() {

        @Override
        public int compare(Card<T> o1, Card<T> o2) {
            return 0;
        }
    };
}

或者,您使用不安全的强制转换:

@SuppressWarnings({ "rawtypes", "unchecked" })
public final static <T extends Enum<T> & Rank> Comparator<Card<T>> 
    comparatorByAttribute1() {
    // Your attribute
    return (Comparator) comparatorByAttribute1;
}

【讨论】:

  • 我希望比较器适用于每个 Card & Rank> 类,并且仅适用于特定的类(ActualType)。我只需要 o1 和 o2 具有相同的泛型类型的限制。
  • @PetrosTsialiamanis:我明白了。不幸的是,Java 中没有泛型属性之类的东西。您将不得不求助于通用静态方法(请参阅更新的答案)。或者你可以使用不安全的演员表。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多