Используя общие методы, действительно ли возможно вернуть различные типы из того же метода?

Мог я иметь что-то вроде этого:

int x = MyMethod<int>();
string y = MyMethod<string>();

Так, один метод, возвращая различные типы на основе T. Конечно, была бы логика в методе, чтобы гарантировать, что это возвращало корректную вещь.

Я никогда не могу заставлять что-то вроде этого работать. Это жалуется, что не может бросить возвращаемое значение к T:

public static T MyMethod<T>()
{
  if(typeof(T) == typeof(Int32))
  {
    return 0;
  }
  else
  {
    return "nothing";
  }
}
5
задан Deane 22 January 2010 в 21:56
поделиться

5 ответов

CSS Redundancy Checker - это средство, запускаемое локально, которое передает таблицу стилей и список URL-адресов или каталог HTML-файлов. Вот описание, приведенное на сайте инструмента:

Простой сценарий, который, учитывая таблицу стилей CSS и файл .txt перечисление URL-адресов HTML-файлов или каталога HTML-файлов приведет к итерации над ними и перечислить операторы CSS в таблице стилей, которые никогда не вызывался в HTML.

В основном это помогает сохранить актуальность и компактность файлов CSS. И это достаточно точно.

-121--689453-

Попытка 2: Я исправил проблему с границей и изменил внешний вид менеджера. Это все еще не совсем то, что вы ищете, хотя..

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.plaf.ColorUIResource; 
public class Main extends JFrame { 
  JTabbedPane tab=new JTabbedPane(); 
  public Main() { 

     setBackground(Color.white);
     setSize(300,300); 
     setTitle("Test Tab pane"); 
     tab.add("First",new myPanel("First")); 
     tab.add("Second",new myPanel("Second")); 
     tab.add("Third",new myPanel("Third")); 
     tab.add("Fourth",new myPanel("Fourth")); 
     tab.addChangeListener(new ChangeTab()); 
     tab.setBackground(Color.white);
     tab.setForeground(Color.black);
     tab.setBorder(BorderFactory.createEmptyBorder());


     getContentPane().add(tab,BorderLayout.CENTER); 
     setVisible(true); 

  } 

  public static void main (String[] args) throws Exception { 
                           UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
    Main main = new Main(); 
  } 

  class ChangeTab implements ChangeListener{ 
    public void stateChanged(ChangeEvent e){ 
        tab.validate(); 
        System.out.println(tab.getSelectedIndex()); 

    } 
  } 

  class myPanel extends JPanel{ 
    public myPanel(String str){ 
       setBackground(Color.white); 
       setBorder(BorderFactory.createEmptyBorder());
       add(new JLabel(str)); 
    } 
  } 

} 
-121--4268524-

Попробуйте выполнить следующие действия

public static T MyMethod<T>() {
  if ( typeof(T) == typeof(Int32) ) {
    return (T)(object)0;
  } else {
    return (T)(object)"nothing";
  }
}

Ниже приведен пример объекта . То, что вы пытаетесь сделать, по своей сути небезопасно, поскольку компилятор не может сделать вывод, что 0 или "ничего" могут быть преобразованы в любой заданный T . Все-таки это безгранично. Так что просто скажите компилятору явно, что это небезопасно при кастинге в объект .

10
ответ дан 13 December 2019 в 19:27
поделиться
- 4268522-

Вы можете сделать, если вы хотите, если вы хотите, чтобы значение «нулевое» значение возвращается, если это не INT. Но если вы хотите строку во всех остальных случаях, проверьте другие ответы.

public static T MyMethod<T>()
{
  if(typeof(T) == typeof(Int32))
  {
    return (T)(object)0;
  }
  else
  {
   return default(T); // or null
  }
}
0
ответ дан 13 December 2019 в 19:27
поделиться

@Nick правильно в его комментарии, что ваш код не скомпилируется. Но предполагая, что вы имеете в виду:

public static T MyMethod<T>()
{
  if(typeof(T) == typeof(Int32))
  {
    return 0;
  }
  else
  {
    return "nothing";
  }
}

Это может быть сложно, чтобы сделать дженерики нечебы, как вы пытаетесь (и действительно противоречит всей точки), но это должно работать:

public static T MyMethod<T>()
{
  if(typeof(T) == typeof(Int32))
  {
    return (T)(object)0;
  }
  else if(typeof(T) == typeof(string))
  {
    return (T)(object)"nothing";
  }

   return default(T);
}
0
ответ дан 13 December 2019 в 19:27
поделиться

Это недействительно, так как нет гарантии, что T является Chastable / Changeable для строки или INT.

Generics не являются вариантами - т. Е. Типы, которые могут удержать что-либо - это время компиляции разрешено в реальный тип. Ваш код не скомпилируется, потому что он не должен. Вы можете обойтись к вопросам компиляции, используя некоторые из взломов, размещенных здесь, но это действительно логическая проблема. Вернитесь и переосмыслите, что вы пытаетесь сделать, вместо того, чтобы пытаться обойти компилятор.

0
ответ дан 13 December 2019 в 19:27
поделиться

Слегка отстранена от темы, но если вы пытаетесь сделать эту штуку, то, возможно, ваш дизайн неправильный...

Почему бы не перегрузить метод и не задать результат в виде параметра out:

void MyMethod(out int result)
{
  result=0;
}

void MyMethod(out string result)
{
  result="my value";
}

Тогда можно сказать:

int value;
MyMethod(out value);

И компилятор выберет правильную версию

.
1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

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