java - 创建具有相同类元素的通用元组

标签 java generics tuples containers

我想创建一个具有两个值的通用元组。例如,具有两个字符串或两个整数的元组等(通用值)。但它不应该能够混合这两个元素,例如字符串与整数(例如 HashMap )。

如何创建类型相同的元组?目前,我对元组中的两个元素使用通配符泛型参数,当然这不会强制开发人员对这两个元素使用相同的类类型。

import java.io.Serializable;

public class Main {
    class Element<T extends Comparable<?> & Serializable> {
        private final T element;

        public Element(T element) {
            this.element = element;
        }

        public String raw() {
            return element.toString();
        }
    }

    class Tuple<T extends Element<?>, U extends Element<?>> {
        private final Element<?> element1;
        private final Element<?> element2;

        public Tuple(Element<?> element1, Element<?> element2) {
            this.element1 = element1;
            this.element2 = element2;
        }

        public Element<?> getElement1() {
            return element1;
        }

        public Element<?> getElement2() {
            return element2;
        }
    }

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        Element<String> element1 = new Element<String>(new String("First tuple element"));
        Element<String> element2 = new Element<String>(new String("Second tuple element"));
        Element<Integer> wrongelement = new Element<Integer>(42); // <-- Should not be possible, but it is...
        Tuple<Element<String>, Element<String>> tuple = new Tuple<Element<String>, Element<String>>(element1, element2);

        // First tuple element
        System.out.println(tuple.getElement1().raw());

        // Second tuple element
        System.out.println(tuple.getElement2().raw());
    }
}

最佳答案

Tuple 中仅使用一种泛型类型类并让您的元素字段属于该通用类型,而不是父类(super class)(即 T element1 而不是 Element<?> element1 ):

class Tuple<T extends Element<?>> {

    private final T element1;
    private final T element2;

    public Tuple(T element1, T element2) {
        this.element1 = element1;
        this.element2 = element2;
    }

    public T getElement1() {
        return element1;
    }

    public T getElement2() {
        return element2;
    }
}

然后您可以简单地使用一种类型实例化它:

public static void main(String... args) {

    Element<String> element1 = new Element<String>(new String("First tuple element"));
    Element<String> element2 = new Element<String>(new String("Second tuple element"));

    Tuple<Element<String>> tuple = new Tuple<Element<String>>(element1, element2);

    // First tuple element
    System.out.println(tuple.getElement1().raw());

    // Second tuple element
    System.out.println(tuple.getElement2().raw());
}

顺便说一句,你不必 new String您的字符串,您可以简单地将它们作为常规字符串提供:

Element<String> element1 = new Element<String>("First tuple element");
Element<String> element2 = new Element<String>("Second tuple element");

关于java - 创建具有相同类元素的通用元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684471/

相关文章:

java - J2EE : Understanding isCommitted and Filters under this scenario

Java XML 分句删除节点

java - 使用有界继承重写 Scala 中 Java 类的抽象方法

java - 泛型困惑中的类型删除

c# - 在运行时检查属性类型并将相同的类型赋予通用 lambda 表达式参数 T

c++ - 这个模板如何找到元组的索引?

javascript - 连接同名的json条目

java - 配置spring缓存咖啡因

C++ - 迭代元组和类型解析与常量参数

python - 在Python中返回数字符号的奇怪语法