Java формальное определение параметра типа (Дженерики)

Мы можем использовать subset из base R

subset(df2, sample1 %in% unlist(c(List1, List2)))

данных

df2 <- structure(list(sample1 = c("a", "c", "b", "c", "a", "d", "d"), 
sample2 = c("b", "c", "c", "d", "c", "f", "h"), N = c(2L, 
1L, 3L, 2L, 3L, 1L, 3L)), class = "data.frame", row.names = c(NA, 
-7L))

List1 <- list('a', 'b')
List2 <- list('c')
8
задан Bhesh Gurung 8 December 2011 в 14:46
поделиться

4 ответа

Дженерики Java не поддерживают типы объединения (этот параметр может быть A ИЛИ B).

На связанной ноте, которая может представлять интерес для некоторых, он действительно поддерживает несколько границ, если Вы хотите осуществить несколько ограничений. Вот пример от JDK, упомянутого в учебном руководстве по дженерикам Java:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
11
ответ дан 5 December 2019 в 10:05
поделиться

Вы могли использовать методы фабрики для всех поддерживаемых типов и сделать конструктора частным/защищающим. Необходимо зафиксировать универсальный тип в конструкторе так или иначе так, чтобы он имел смысл, таким образом, Вы могли, вероятно, кодировать его как это:

public final class MyClass<T> {
    public static MyClass<Integer> newInstance(int i) {
        return new MyClass<Integer>(i);
    }
    public static MyClass<String> newInstance(String s) {
        return new MyClass<String>(s);
    }
    //More factory methods...

    protected MyClass(T obj) {
        //...
    }
}

Или если Вы не хотите параметр конструктора, что-то вроде этого: общедоступный заключительный класс MyClass {общедоступный статический MyClass newIntegerInstance () {возвращает новый MyClass ();}//...}

Как erickson указанный, общая реализация может положиться только на Объект так или иначе, таким образом, единственное ограничение, что можно создать другие реализации для других типов помимо примитива и Строки.

4
ответ дан 5 December 2019 в 10:05
поделиться

Интересный вопрос, это пугалось меня немного. Однако, по-видимому, это невозможно. Я попробовал несколько различных взломов, ни один действительно не работает.

0
ответ дан 5 December 2019 в 10:05
поделиться

В то время как дженерики не будут работать здесь, базовый тип с производными типами для Number и String будет. Так как универсальный тип стерся бы к Object так или иначе любая функциональность, которую Вы поместили бы, там может войти в абстрактный базовый класс. Вам, вероятно, будет нужно только определенное для типа средство доступа на подклассе для получения значения.

Кроме того, быть осторожным с Number класс. Это не ограничено упаковкой типов примитивов, поскольку любой может расширить его — например, BigInteger.

2
ответ дан 5 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: